aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/indxpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/indxpath.c')
-rw-r--r--src/backend/optimizer/path/indxpath.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 984c930e3a6..228a876f71a 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.129 2002/12/15 16:17:49 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.130 2002/12/16 21:30:29 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1398,6 +1398,7 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
List *ilist;
List *jlist;
InnerIndexscanInfo *info;
+ MemoryContext oldcontext;
/*
* Nestloop only supports inner and left joins.
@@ -1415,15 +1416,27 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
}
/*
* If there are no indexable joinclauses for this rel, exit quickly.
- * Otherwise, intersect the given outer_relids with index_outer_relids
- * to find the set of outer relids actually relevant for this index.
- * If there are none, again we can fail immediately.
*/
if (!rel->index_outer_relids)
return NULL;
+ /*
+ * Otherwise, we have to do path selection in the memory context of
+ * the given rel, so that any created path can be safely attached to
+ * the rel's cache of best inner paths. (This is not currently an
+ * issue for normal planning, but it is an issue for GEQO planning.)
+ */
+ oldcontext = MemoryContextSwitchTo(GetMemoryChunkContext(rel));
+ /*
+ * Intersect the given outer_relids with index_outer_relids
+ * to find the set of outer relids actually relevant for this index.
+ * If there are none, again we can fail immediately.
+ */
outer_relids = set_intersecti(rel->index_outer_relids, outer_relids);
if (!outer_relids)
+ {
+ MemoryContextSwitchTo(oldcontext);
return NULL;
+ }
/*
* Look to see if we already computed the result for this set of
* relevant outerrels. (We include the isouterjoin status in the
@@ -1437,6 +1450,7 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
info->isouterjoin == isouterjoin)
{
freeList(outer_relids);
+ MemoryContextSwitchTo(oldcontext);
return info->best_innerpath;
}
}
@@ -1517,6 +1531,8 @@ best_inner_indexscan(Query *root, RelOptInfo *rel,
info->best_innerpath = cheapest;
rel->index_inner_paths = lcons(info, rel->index_inner_paths);
+ MemoryContextSwitchTo(oldcontext);
+
return cheapest;
}