Commit 8195f8f0 authored by Bruce Momjian's avatar Bruce Momjian

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>
parent 8add2e1b
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.54 2003/01/19 00:13:29 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.55 2003/02/13 05:19:59 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -33,6 +33,8 @@ ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ] ...@@ -33,6 +33,8 @@ ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ]
ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET STATISTICS <replaceable class="PARAMETER">integer</replaceable> ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET STATISTICS <replaceable class="PARAMETER">integer</replaceable>
ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ] ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ]
ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ]
SET WITHOUT OIDS
ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ] ALTER TABLE [ ONLY ] <replaceable class="PARAMETER">table</replaceable> [ * ]
RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable RENAME [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TO <replaceable
class="PARAMETER">new_column</replaceable> class="PARAMETER">new_column</replaceable>
...@@ -286,11 +288,24 @@ ALTER TABLE <replaceable class="PARAMETER">table</replaceable> ...@@ -286,11 +288,24 @@ ALTER TABLE <replaceable class="PARAMETER">table</replaceable>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>SET WITHOUT OIDS</term>
<listitem>
<para>
Removes the <literal>OID</literal> column from the the table. Removing (setting without)
oids from a table also do not occur immediately. The space an <literal>OID</literal>
uses will be reclaimed when the tuple is updated. Without updating the tuple, both the
space and the value of the <literal>OID</literal> are maintained indefinitely. This is
semantically similar to the <literal>DROP COLUMN</literal> process.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term>RENAME</term> <term>RENAME</term>
<listitem> <listitem>
<para> <para>
The <literal>RENAME</literal> forms change the name of a table The <literal>RENAME</literal> forms change the name of a table
(or an index, sequence, or view) or the name of an individual column in (or an index, sequence, or view) or the name of an individual column in
a table. There is no effect on the stored data. a table. There is no effect on the stored data.
</para> </para>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -2134,7 +2134,6 @@ AlterTableAlterColumnSetNotNull(Oid myrelid, bool recurse,
heap_close(rel, NoLock); heap_close(rel, NoLock);
} }
/* /*
* ALTER TABLE ALTER COLUMN SET/DROP DEFAULT * ALTER TABLE ALTER COLUMN SET/DROP DEFAULT
*/ */
...@@ -2384,6 +2383,122 @@ AlterTableAlterColumnFlags(Oid myrelid, bool recurse, ...@@ -2384,6 +2383,122 @@ AlterTableAlterColumnFlags(Oid myrelid, bool recurse,
heap_close(rel, NoLock); /* close rel, but keep lock! */ 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 * ALTER TABLE DROP COLUMN
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.401 2003/02/10 04:44:45 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.402 2003/02/13 05:19:59 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -1132,7 +1132,7 @@ AlterTableStmt: ...@@ -1132,7 +1132,7 @@ AlterTableStmt:
| ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P | ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P
{ {
AlterTableStmt *n = makeNode(AlterTableStmt); AlterTableStmt *n = makeNode(AlterTableStmt);
n->subtype = 'O'; n->subtype = 'n';
n->relation = $3; n->relation = $3;
n->name = $6; n->name = $6;
$$ = (Node *)n; $$ = (Node *)n;
...@@ -1187,6 +1187,14 @@ AlterTableStmt: ...@@ -1187,6 +1187,14 @@ AlterTableStmt:
n->behavior = $7; n->behavior = $7;
$$ = (Node *)n; $$ = (Node *)n;
} }
/* ALTER TABLE <relation> SET WITHOUT OIDS */
| ALTER TABLE relation_expr SET WITHOUT OIDS
{
AlterTableStmt *n = makeNode(AlterTableStmt);
n->relation = $3;
n->subtype = 'o';
$$ = (Node *)n;
}
/* ALTER TABLE <name> CREATE TOAST TABLE */ /* ALTER TABLE <name> CREATE TOAST TABLE */
| ALTER TABLE qualified_name CREATE TOAST TABLE | ALTER TABLE qualified_name CREATE TOAST TABLE
{ {
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.191 2003/02/10 04:44:46 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.192 2003/02/13 05:20:01 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -549,7 +549,7 @@ ProcessUtility(Node *parsetree, ...@@ -549,7 +549,7 @@ ProcessUtility(Node *parsetree,
interpretInhOption(stmt->relation->inhOpt), interpretInhOption(stmt->relation->inhOpt),
stmt->name); stmt->name);
break; break;
case 'O': /* ALTER COLUMN SET NOT NULL */ case 'n': /* ALTER COLUMN SET NOT NULL */
AlterTableAlterColumnSetNotNull(relid, AlterTableAlterColumnSetNotNull(relid,
interpretInhOption(stmt->relation->inhOpt), interpretInhOption(stmt->relation->inhOpt),
stmt->name); stmt->name);
...@@ -611,6 +611,11 @@ ProcessUtility(Node *parsetree, ...@@ -611,6 +611,11 @@ ProcessUtility(Node *parsetree,
AlterTableOwner(relid, AlterTableOwner(relid,
get_usesysid(stmt->name)); get_usesysid(stmt->name));
break; break;
case 'o': /* ADD OIDS */
AlterTableAlterOids(relid,
interpretInhOption(stmt->relation->inhOpt),
false);
break;
default: /* oops */ default: /* oops */
elog(ERROR, "ProcessUtility: Invalid type for AlterTableStmt: %d", elog(ERROR, "ProcessUtility: Invalid type for AlterTableStmt: %d",
stmt->subtype); stmt->subtype);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: tablecmds.h,v 1.10 2002/11/11 22:19:24 tgl Exp $ * $Id: tablecmds.h,v 1.11 2003/02/13 05:20:03 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -47,6 +47,8 @@ extern void AlterTableCreateToastTable(Oid relOid, bool silent); ...@@ -47,6 +47,8 @@ extern void AlterTableCreateToastTable(Oid relOid, bool silent);
extern void AlterTableOwner(Oid relationOid, int32 newOwnerSysId); extern void AlterTableOwner(Oid relationOid, int32 newOwnerSysId);
extern void AlterTableAlterOids(Oid myrelid, bool recurse, bool setOid);
extern Oid DefineRelation(CreateStmt *stmt, char relkind); extern Oid DefineRelation(CreateStmt *stmt, char relkind);
extern void RemoveRelation(const RangeVar *relation, DropBehavior behavior); extern void RemoveRelation(const RangeVar *relation, DropBehavior behavior);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: parsenodes.h,v 1.229 2003/02/10 04:44:47 tgl Exp $ * $Id: parsenodes.h,v 1.230 2003/02/13 05:20:03 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -698,7 +698,7 @@ typedef struct AlterTableStmt ...@@ -698,7 +698,7 @@ typedef struct AlterTableStmt
* A = add column * A = add column
* T = alter column default * T = alter column default
* N = alter column drop not null * N = alter column drop not null
* O = alter column set not null * n = alter column set not null
* S = alter column statistics * S = alter column statistics
* M = alter column storage * M = alter column storage
* D = drop column * D = drop column
...@@ -708,6 +708,7 @@ typedef struct AlterTableStmt ...@@ -708,6 +708,7 @@ typedef struct AlterTableStmt
* X = drop constraint * X = drop constraint
* E = create toast table * E = create toast table
* U = change owner * U = change owner
* o = DROP OIDS
*------------ *------------
*/ */
RangeVar *relation; /* table to work on */ RangeVar *relation; /* table to work on */
......
...@@ -1179,6 +1179,62 @@ order by relname, attnum; ...@@ -1179,6 +1179,62 @@ order by relname, attnum;
drop table p1, p2 cascade; drop table p1, p2 cascade;
NOTICE: Drop cascades to table c1 NOTICE: Drop cascades to table c1
NOTICE: Drop cascades to table gc1 NOTICE: Drop cascades to table gc1
--
-- Test the ALTER TABLE WITHOUT OIDS command
--
create table altstartwith (col integer) with oids;
insert into altstartwith values (1);
select oid > 0, * from altstartwith;
?column? | col
----------+-----
t | 1
(1 row)
alter table altstartwith set without oids;
select oid > 0, * from altstartwith; -- fails
ERROR: Attribute "oid" not found
select * from altstartwith;
col
-----
1
(1 row)
-- Run inheritance tests
create table altwithoid (col integer) with oids;
-- Inherits parents oid column
create table altinhoid () inherits (altwithoid) without oids;
insert into altinhoid values (1);
select oid > 0, * from altwithoid;
?column? | col
----------+-----
t | 1
(1 row)
select oid > 0, * from altinhoid;
?column? | col
----------+-----
t | 1
(1 row)
alter table altwithoid set without oids;
alter table altinhoid set without oids; -- fails
ERROR: ALTER TABLE: Table is already WITHOUT OIDS
select oid > 0, * from altwithoid; -- fails
ERROR: Attribute "oid" not found
select oid > 0, * from altinhoid; -- fails
ERROR: Attribute "oid" not found
select * from altwithoid;
col
-----
1
(1 row)
select * from altinhoid;
col
-----
1
(1 row)
-- test renumbering of child-table columns in inherited operations -- test renumbering of child-table columns in inherited operations
create table p1 (f1 int); create table p1 (f1 int);
create table c1 (f2 text, f3 int) inherits (p1); create table c1 (f2 text, f3 int) inherits (p1);
......
...@@ -850,6 +850,39 @@ order by relname, attnum; ...@@ -850,6 +850,39 @@ order by relname, attnum;
drop table p1, p2 cascade; drop table p1, p2 cascade;
--
-- Test the ALTER TABLE WITHOUT OIDS command
--
create table altstartwith (col integer) with oids;
insert into altstartwith values (1);
select oid > 0, * from altstartwith;
alter table altstartwith set without oids;
select oid > 0, * from altstartwith; -- fails
select * from altstartwith;
-- Run inheritance tests
create table altwithoid (col integer) with oids;
-- Inherits parents oid column
create table altinhoid () inherits (altwithoid) without oids;
insert into altinhoid values (1);
select oid > 0, * from altwithoid;
select oid > 0, * from altinhoid;
alter table altwithoid set without oids;
alter table altinhoid set without oids; -- fails
select oid > 0, * from altwithoid; -- fails
select oid > 0, * from altinhoid; -- fails
select * from altwithoid;
select * from altinhoid;
-- test renumbering of child-table columns in inherited operations -- test renumbering of child-table columns in inherited operations
create table p1 (f1 int); create table p1 (f1 int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment