1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-21 02:52:47 +03:00

Code for WITHOUT OIDS.

On Wed, 2003-01-08 at 21:59, Christopher Kings-Lynne wrote:
> I agree.  I want to remove OIDs from heaps of our tables when we go to 7.3.
> I'd rather not have to do it in the dump due to down time.


Rod Taylor <rbt@rbt.ca>
This commit is contained in:
Bruce Momjian
2003-02-13 05:20:05 +00:00
parent 8add2e1bca
commit 8195f8f042
8 changed files with 246 additions and 11 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.66 2003/02/09 06:56:26 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.67 2003/02/13 05:19:59 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2134,7 +2134,6 @@ AlterTableAlterColumnSetNotNull(Oid myrelid, bool recurse,
heap_close(rel, NoLock);
}
/*
* ALTER TABLE ALTER COLUMN SET/DROP DEFAULT
*/
@@ -2384,6 +2383,122 @@ AlterTableAlterColumnFlags(Oid myrelid, bool recurse,
heap_close(rel, NoLock); /* close rel, but keep lock! */
}
/*
* ALTER TABLE SET {WITHOUT} OIDS
*/
void
AlterTableAlterOids(Oid myrelid, bool recurse, bool setOid)
{
Relation rel;
Relation class_rel;
HeapTuple tuple;
Form_pg_class tuple_class;
rel = heap_open(myrelid, AccessExclusiveLock);
if (rel->rd_rel->relkind != RELKIND_RELATION)
elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
RelationGetRelationName(rel));
if (!allowSystemTableMods
&& IsSystemRelation(rel))
elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
RelationGetRelationName(rel));
if (!pg_class_ownercheck(myrelid, GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, RelationGetRelationName(rel));
/* Get its pg_class tuple, too */
class_rel = heap_openr(RelationRelationName, RowExclusiveLock);
tuple = SearchSysCacheCopy(RELOID,
ObjectIdGetDatum(myrelid),
0, 0, 0);
if (!HeapTupleIsValid(tuple))
elog(ERROR, "ALTER TABLE: relation %u not found", myrelid);
tuple_class = (Form_pg_class) GETSTRUCT(tuple);
/* Can we change the ownership of this tuple? */
CheckTupleType(tuple_class);
/*
* Okay, this is a valid tuple: check it's hasoids flag
* to see if we actually need to change anything
*/
if (tuple_class->relhasoids == setOid)
elog(ERROR, "ALTER TABLE: Table is already %s",
setOid ? "WITH OIDS" : "WITHOUT OIDS");
/*
* Propagate to children if desired
*/
if (recurse)
{
List *child,
*children;
/* this routine is actually in the planner */
children = find_all_inheritors(myrelid);
/*
* find_all_inheritors does the recursive search of the
* inheritance hierarchy, so all we have to do is process all of
* the relids in the list that it returns.
*/
foreach(child, children)
{
Oid childrelid = lfirsti(child);
if (childrelid == myrelid)
continue;
AlterTableAlterOids(childrelid, false, setOid);
}
}
tuple_class->relhasoids = setOid;
simple_heap_update(class_rel, &tuple->t_self, tuple);
/* Keep the catalog indexes up to date */
CatalogUpdateIndexes(class_rel, tuple);
if (setOid)
/*
* TODO: Generate the now required OID pg_attribute entry
*/
elog(ERROR, "ALTER TABLE WITH OIDS is unsupported");
else
{
HeapTuple atttup;
Relation attrel;
/* Add / Remove the oid record from pg_attribute */
attrel = heap_open(RelOid_pg_attribute, RowExclusiveLock);
/*
* Oids are being removed from the relation, so we need
* to remove the oid pg_attribute record relating.
*/
atttup = SearchSysCache(ATTNUM,
ObjectIdGetDatum(myrelid),
ObjectIdAttributeNumber, 0, 0);
if (!HeapTupleIsValid(atttup))
elog(ERROR, "ALTER TABLE: relation %u doesn't have an Oid column to remove", myrelid);
simple_heap_delete(attrel, &atttup->t_self);
ReleaseSysCache(atttup);
heap_close(attrel, NoLock); /* close rel, but keep lock! */
}
heap_close(rel, NoLock); /* close rel, but keep lock! */
heap_close(class_rel, NoLock); /* close rel, but keep lock! */
}
/*
* ALTER TABLE DROP COLUMN