mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +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:
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$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> [ * ]
|
|||||||
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>
|
|||||||
</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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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:
|
|||||||
| 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:
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
* 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);
|
|||||||
|
|
||||||
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 @@
|
|||||||
* 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
|
|||||||
* 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
|
|||||||
* 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;
|
|||||||
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;
|
|||||||
|
|
||||||
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);
|
||||||
|
Reference in New Issue
Block a user