summaryrefslogtreecommitdiff
path: root/src/backend/commands/vacuum.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-07-14 22:18:02 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-07-14 22:18:02 +0000
commit6bfe64032efd043f80a495a495331dcfc2d9f05c (patch)
treed0cc092d38bdea690a79e4aebfa4629e1db54e96 /src/backend/commands/vacuum.c
parenta30bc7c75a54910a78d1939bd32f5d91164ba8a4 (diff)
Cleanup of code for creating index entries. Functional indexes with
pass-by-ref data types --- eg, an index on lower(textfield) --- no longer leak memory during index creation or update. Clean up a lot of redundant code ... did you know that copy, vacuum, truncate, reindex, extend index, and bootstrap each basically duplicated the main executor's logic for extracting information about an index and preparing index entries? Functional indexes should be a little faster now too, due to removal of repeated function lookups. CREATE INDEX 'opt_type' clause is deimplemented by these changes, but I haven't removed it from the parser yet (need to merge with Thomas' latest change set first).
Diffstat (limited to 'src/backend/commands/vacuum.c')
-rw-r--r--src/backend/commands/vacuum.c110
1 files changed, 52 insertions, 58 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 71682baa8cd..ee0ebeb4bb7 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.162 2000/07/05 16:17:38 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.163 2000/07/14 22:17:42 tgl Exp $
*
*-------------------------------------------------------------------------
@@ -28,6 +28,7 @@
#include "catalog/index.h"
#include "commands/vacuum.h"
#include "miscadmin.h"
+#include "nodes/execnodes.h"
#include "storage/sinval.h"
#include "storage/smgr.h"
#include "tcop/tcopprot.h"
@@ -71,7 +72,8 @@ static void reap_page(VacPageList vacpagelist, VacPage vacpage);
static void vpage_insert(VacPageList vacpagelist, VacPage vpnew);
static void get_indices(Relation relation, int *nindices, Relation **Irel);
static void close_indices(int nindices, Relation *Irel);
-static void get_index_desc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc);
+static IndexInfo **get_index_desc(Relation onerel, int nindices,
+ Relation *Irel);
static void *vac_find_eq(void *bot, int nelem, int size, void *elm,
int (*compar) (const void *, const void *));
static int vac_cmp_blk(const void *left, const void *right);
@@ -948,9 +950,10 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
newitemid;
HeapTupleData tuple,
newtup;
- TupleDesc tupdesc = NULL;
- Datum *idatum = NULL;
- char *inulls = NULL;
+ TupleDesc tupdesc;
+ IndexInfo **indexInfo = NULL;
+ Datum idatum[INDEX_MAX_KEYS];
+ char inulls[INDEX_MAX_KEYS];
InsertIndexResult iresult;
VacPageListData Nvacpagelist;
VacPage cur_page = NULL,
@@ -958,8 +961,6 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
vacpage,
*curpage;
int cur_item = 0;
- IndDesc *Idesc,
- *idcur;
int last_move_dest_block = -1,
last_vacuum_block,
i = 0;
@@ -980,13 +981,10 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
myXID = GetCurrentTransactionId();
myCID = GetCurrentCommandId();
+ tupdesc = RelationGetDescr(onerel);
+
if (Irel != (Relation *) NULL) /* preparation for index' inserts */
- {
- get_index_desc(onerel, nindices, Irel, &Idesc);
- tupdesc = RelationGetDescr(onerel);
- idatum = (Datum *) palloc(INDEX_MAX_KEYS * sizeof(*idatum));
- inulls = (char *) palloc(INDEX_MAX_KEYS * sizeof(*inulls));
- }
+ indexInfo = get_index_desc(onerel, nindices, Irel);
Nvacpagelist.num_pages = 0;
num_fraged_pages = fraged_pages->num_pages;
@@ -1456,15 +1454,22 @@ repair_frag(VRelStats *vacrelstats, Relation onerel,
if (Irel != (Relation *) NULL)
{
- for (i = 0, idcur = Idesc; i < nindices; i++, idcur++)
+ /*
+ * XXX using CurrentMemoryContext here means
+ * intra-vacuum memory leak for functional indexes.
+ * Should fix someday.
+ *
+ * XXX This code fails to handle partial indexes!
+ * Probably should change it to use ExecOpenIndices.
+ */
+ for (i = 0; i < nindices; i++)
{
- FormIndexDatum(idcur->natts,
- (AttrNumber *) &(idcur->tform->indkey[0]),
+ FormIndexDatum(indexInfo[i],
&newtup,
tupdesc,
+ CurrentMemoryContext,
idatum,
- inulls,
- idcur->finfoP);
+ inulls);
iresult = index_insert(Irel[i],
idatum,
inulls,
@@ -1575,15 +1580,22 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
/* insert index' tuples if needed */
if (Irel != (Relation *) NULL)
{
- for (i = 0, idcur = Idesc; i < nindices; i++, idcur++)
+ /*
+ * XXX using CurrentMemoryContext here means
+ * intra-vacuum memory leak for functional indexes.
+ * Should fix someday.
+ *
+ * XXX This code fails to handle partial indexes!
+ * Probably should change it to use ExecOpenIndices.
+ */
+ for (i = 0; i < nindices; i++)
{
- FormIndexDatum(idcur->natts,
- (AttrNumber *) &(idcur->tform->indkey[0]),
+ FormIndexDatum(indexInfo[i],
&newtup,
tupdesc,
+ CurrentMemoryContext,
idatum,
- inulls,
- idcur->finfoP);
+ inulls);
iresult = index_insert(Irel[i],
idatum,
inulls,
@@ -1821,10 +1833,8 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
if (Irel != (Relation *) NULL) /* pfree index' allocations */
{
- pfree(Idesc);
- pfree(idatum);
- pfree(inulls);
close_indices(nindices, Irel);
+ pfree(indexInfo);
}
pfree(vacpage);
@@ -2347,46 +2357,30 @@ close_indices(int nindices, Relation *Irel)
}
-static void
-get_index_desc(Relation onerel, int nindices, Relation *Irel, IndDesc **Idesc)
+/*
+ * Obtain IndexInfo data for each index on the rel
+ */
+static IndexInfo **
+get_index_desc(Relation onerel, int nindices, Relation *Irel)
{
- IndDesc *idcur;
- HeapTuple cachetuple;
- AttrNumber *attnumP;
- int natts;
+ IndexInfo **indexInfo;
int i;
+ HeapTuple cachetuple;
- *Idesc = (IndDesc *) palloc(nindices * sizeof(IndDesc));
+ indexInfo = (IndexInfo **) palloc(nindices * sizeof(IndexInfo *));
- for (i = 0, idcur = *Idesc; i < nindices; i++, idcur++)
+ for (i = 0; i < nindices; i++)
{
- cachetuple = SearchSysCacheTupleCopy(INDEXRELID,
+ cachetuple = SearchSysCacheTuple(INDEXRELID,
ObjectIdGetDatum(RelationGetRelid(Irel[i])),
- 0, 0, 0);
- Assert(cachetuple);
-
- /*
- * we never free the copy we make, because Idesc needs it for
- * later
- */
- idcur->tform = (Form_pg_index) GETSTRUCT(cachetuple);
- for (attnumP = &(idcur->tform->indkey[0]), natts = 0;
- natts < INDEX_MAX_KEYS && *attnumP != InvalidAttrNumber;
- attnumP++, natts++);
- if (idcur->tform->indproc != InvalidOid)
- {
- idcur->finfoP = &(idcur->finfo);
- FIgetnArgs(idcur->finfoP) = natts;
- natts = 1;
- FIgetProcOid(idcur->finfoP) = idcur->tform->indproc;
- *(FIgetname(idcur->finfoP)) = '\0';
- }
- else
- idcur->finfoP = (FuncIndexInfo *) NULL;
-
- idcur->natts = natts;
+ 0, 0, 0);
+ if (!HeapTupleIsValid(cachetuple))
+ elog(ERROR, "get_index_desc: index %u not found",
+ RelationGetRelid(Irel[i]));
+ indexInfo[i] = BuildIndexInfo(cachetuple);
}
+ return indexInfo;
}