Skip to content

Commit 1940434

Browse files
committed
Repair sloppiness about where cached mergeclause pathkeys are allocated.
Without this fix, CVS tip dumps core when running the regression tests with geqo_threshold = 2. I would think that a similar patch might be needed in 7.3, but cannot duplicate the failure in that branch --- so for now, leave well enough alone.
1 parent f7d8362 commit 1940434

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/backend/optimizer/path/pathkeys.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Portions Copyright (c) 1994, Regents of the University of California
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.47 2003/02/15 20:12:40 tgl Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/pathkeys.c,v 1.48 2003/05/02 19:48:53 tgl Exp $
1515
*
1616
*-------------------------------------------------------------------------
1717
*/
@@ -27,6 +27,7 @@
2727
#include "parser/parsetree.h"
2828
#include "parser/parse_func.h"
2929
#include "utils/lsyscache.h"
30+
#include "utils/memutils.h"
3031

3132

3233
static PathKeyItem *makePathKeyItem(Node *key, Oid sortop);
@@ -942,26 +943,35 @@ make_pathkeys_for_sortclauses(List *sortclauses,
942943
* same, but not if the mergeclause appears above an OUTER JOIN.)
943944
* This is a worthwhile savings because these routines will be invoked
944945
* many times when dealing with a many-relation query.
946+
*
947+
* We have to be careful that the cached values are palloc'd in the same
948+
* context the RestrictInfo node itself is in. This is not currently a
949+
* problem for normal planning, but it is an issue for GEQO planning.
945950
*/
946951
void
947952
cache_mergeclause_pathkeys(Query *root, RestrictInfo *restrictinfo)
948953
{
949954
Node *key;
950955
PathKeyItem *item;
956+
MemoryContext oldcontext;
951957

952958
Assert(restrictinfo->mergejoinoperator != InvalidOid);
953959

954960
if (restrictinfo->left_pathkey == NIL)
955961
{
962+
oldcontext = MemoryContextSwitchTo(GetMemoryChunkContext(restrictinfo));
956963
key = get_leftop(restrictinfo->clause);
957964
item = makePathKeyItem(key, restrictinfo->left_sortop);
958965
restrictinfo->left_pathkey = make_canonical_pathkey(root, item);
966+
MemoryContextSwitchTo(oldcontext);
959967
}
960968
if (restrictinfo->right_pathkey == NIL)
961969
{
970+
oldcontext = MemoryContextSwitchTo(GetMemoryChunkContext(restrictinfo));
962971
key = get_rightop(restrictinfo->clause);
963972
item = makePathKeyItem(key, restrictinfo->right_sortop);
964973
restrictinfo->right_pathkey = make_canonical_pathkey(root, item);
974+
MemoryContextSwitchTo(oldcontext);
965975
}
966976
}
967977

0 commit comments

Comments
 (0)