summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-10-04 20:38:49 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-10-04 20:38:49 +0000
commitbf3473c468b1938f782fdcc208bd62c4b061daa3 (patch)
tree06ee5cbd2cad4cf0dee22ec1884bb4ecf84eb135
parentcbb3edc7e57d685a4b67f929002e2ac629755aad (diff)
downloadpostgresql-bf3473c468b1938f782fdcc208bd62c4b061daa3.tar.gz
Oops, wrong message with the other patch...this was the patch for the otherPG95-1_08
comment, so here is the comment for the other patch *grin* > > You are right. I checked the gramar and saw the ability to use the > > parameter. I looked at the manual pages, and saw no reference to it. I > > tried running it, and found vacuum does nothing when you give it a table > > name. > > > > I checked a debug version of postgres, and the table name is passed to > > vacuum() in the variable (char *vacrel). The problem is that the vacuum > > spans transactions, and the vacrel name gets changed to '<vacuum>', > > which is the name of the portal that gets created in > > vacuum.c::_vc_vacuum(). vacuum.c::_vc_init() does a > > CommitTransactionCommand() which frees the memory allocated to vacrel. > > > > Should I change vacuum.c to copy the relation name to a local string > > variable of vacuum(), or do you recommend we allocate the table name in > > a different fashion? You are the man who knows the most about this. > > static NameData VacRel; Done. Attached is the patch. I have already applied it to the 2.0 tree. (Marc!) I tested it and it works. I also applied documentation patches to go with it. So now vacuum can be run for only one table if you wish. Submitted by: Bruce Momjian <maillist@candle.pha.pa.us>
-rw-r--r--src/backend/commands/vacuum.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 7987101a55..ad8e2cf824 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.1.1.1.2.1 1996/10/04 20:37:09 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.1.1.1.2.2 1996/10/04 20:38:49 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -200,9 +200,11 @@ _vc_getrels(Portal p, NameData *VacRelP)
VRelList vrl, cur;
Datum d;
char *rname;
+ char rkind;
int16 smgrno;
bool n;
ScanKeyData pgckey;
+ bool found = false;
StartTransactionCommand();
@@ -225,6 +227,8 @@ _vc_getrels(Portal p, NameData *VacRelP)
while (HeapTupleIsValid(pgctup = heap_getnext(pgcscan, 0, &buf))) {
+ found = true;
+
/*
* We have to be careful not to vacuum the archive (since it
* already contains vacuumed tuples), and not to vacuum
@@ -252,6 +256,18 @@ _vc_getrels(Portal p, NameData *VacRelP)
continue;
}
+ d = (Datum) heap_getattr(pgctup, buf, Anum_pg_class_relkind,
+ pgcdesc, &n);
+
+ rkind = DatumGetChar(d);
+
+ /* skip system relations */
+ if (rkind != 'r') {
+ ReleaseBuffer(buf);
+ elog(NOTICE, "Vacuum: can not process index and certain system tables" );
+ continue;
+ }
+
/* get a relation list entry for this guy */
old = MemoryContextSwitchTo((MemoryContext)portalmem);
if (vrl == (VRelList) NULL) {
@@ -272,7 +288,10 @@ _vc_getrels(Portal p, NameData *VacRelP)
/* wei hates it if you forget to do this */
ReleaseBuffer(buf);
}
+ if (found == false)
+ elog(NOTICE, "Vacuum: table not found" );
+
heap_close(pgclass);
heap_endscan(pgcscan);