Tom Lane wrote:
> Alvaro Herrera <[EMAIL PROTECTED]> writes:
> > I suppose it would be pretty trivial to set the relfrozenxid to
> > RecentXmin or something during TRUNCATE.
>
> I had the idea we were doing that already --- at least I'm pretty sure I
> remember it being discussed. But I see it's not being done in HEAD.
Patch to do it attached. I am thinking we can do something similar in
CLUSTER as well.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Index: src/backend/catalog/index.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/catalog/index.c,v
retrieving revision 1.282
diff -c -p -r1.282 index.c
*** src/backend/catalog/index.c 29 Mar 2007 00:15:37 -0000 1.282
--- src/backend/catalog/index.c 15 May 2007 22:06:12 -0000
*************** index_update_stats(Relation rel, bool ha
*** 1188,1196 ****
* setNewRelfilenode - assign a new relfilenode value to the relation
*
* Caller must already hold exclusive lock on the relation.
*/
void
! setNewRelfilenode(Relation relation)
{
Oid newrelfilenode;
RelFileNode newrnode;
--- 1188,1199 ----
* setNewRelfilenode - assign a new relfilenode value to the relation
*
* Caller must already hold exclusive lock on the relation.
+ *
+ * The relation is marked with relfrozenxid=freezeXid (InvalidTransactionId
+ * must be passed for indexes)
*/
void
! setNewRelfilenode(Relation relation, TransactionId freezeXid)
{
Oid newrelfilenode;
RelFileNode newrnode;
*************** setNewRelfilenode(Relation relation)
*** 1204,1209 ****
--- 1207,1216 ----
relation->rd_rel->relkind == RELKIND_INDEX);
/* Can't change for shared tables or indexes */
Assert(!relation->rd_rel->relisshared);
+ /* Indexes must have Invalid frozenxid; other relations must not */
+ Assert((relation->rd_rel->relkind == RELKIND_INDEX &&
+ freezeXid == InvalidTransactionId) ||
+ TransactionIdIsNormal(freezeXid));
/* Allocate a new relfilenode */
newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace,
*************** setNewRelfilenode(Relation relation)
*** 1241,1246 ****
--- 1248,1254 ----
rd_rel->relfilenode = newrelfilenode;
rd_rel->relpages = 0; /* it's empty until further notice */
rd_rel->reltuples = 0;
+ rd_rel->relfrozenxid = freezeXid;
simple_heap_update(pg_class, &tuple->t_self, tuple);
CatalogUpdateIndexes(pg_class, tuple);
*************** reindex_index(Oid indexId)
*** 1957,1963 ****
/*
* We'll build a new physical relation for the index.
*/
! setNewRelfilenode(iRel);
}
/* Initialize the index and rebuild */
--- 1965,1971 ----
/*
* We'll build a new physical relation for the index.
*/
! setNewRelfilenode(iRel, InvalidTransactionId);
}
/* Initialize the index and rebuild */
Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/commands/tablecmds.c,v
retrieving revision 1.223
diff -c -p -r1.223 tablecmds.c
*** src/backend/commands/tablecmds.c 14 May 2007 20:24:41 -0000 1.223
--- src/backend/commands/tablecmds.c 15 May 2007 22:08:33 -0000
*************** ExecuteTruncate(TruncateStmt *stmt)
*** 616,622 ****
* the relfilenode value. The old storage file is scheduled for
* deletion at commit.
*/
! setNewRelfilenode(rel);
heap_relid = RelationGetRelid(rel);
toast_relid = rel->rd_rel->reltoastrelid;
--- 616,622 ----
* the relfilenode value. The old storage file is scheduled for
* deletion at commit.
*/
! setNewRelfilenode(rel, RecentXmin);
heap_relid = RelationGetRelid(rel);
toast_relid = rel->rd_rel->reltoastrelid;
*************** ExecuteTruncate(TruncateStmt *stmt)
*** 629,635 ****
if (OidIsValid(toast_relid))
{
rel = relation_open(toast_relid, AccessExclusiveLock);
! setNewRelfilenode(rel);
heap_close(rel, NoLock);
}
--- 629,635 ----
if (OidIsValid(toast_relid))
{
rel = relation_open(toast_relid, AccessExclusiveLock);
! setNewRelfilenode(rel, RecentXmin);
heap_close(rel, NoLock);
}
Index: src/include/catalog/index.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/catalog/index.h,v
retrieving revision 1.73
diff -c -p -r1.73 index.h
*** src/include/catalog/index.h 9 Jan 2007 02:14:15 -0000 1.73
--- src/include/catalog/index.h 15 May 2007 21:59:31 -0000
*************** extern void FormIndexDatum(IndexInfo *in
*** 53,59 ****
Datum *values,
bool *isnull);
! extern void setNewRelfilenode(Relation relation);
extern void index_build(Relation heapRelation,
Relation indexRelation,
--- 53,59 ----
Datum *values,
bool *isnull);
! extern void setNewRelfilenode(Relation relation, TransactionId freezeXid);
extern void index_build(Relation heapRelation,
Relation indexRelation,
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faq