From dd29fc2f61e91df8d5879b2dfd02bbabafa182ff Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 15 Dec 2004 21:13:34 +0000 Subject: [PATCH] Fix another place broken by new List implementation :-(. Per example from goranpop@nspoint.net. I think this escaped notice because in simple cases the list is NIL on entry. --- src/backend/optimizer/geqo/geqo_eval.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c index 90aa34fa59..254fcd8956 100644 --- a/src/backend/optimizer/geqo/geqo_eval.c +++ b/src/backend/optimizer/geqo/geqo_eval.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_eval.c,v 1.71 2004/08/29 05:06:43 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_eval.c,v 1.72 2004/12/15 21:13:34 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -80,12 +80,17 @@ geqo_eval(Gene *tour, int num_gene, GeqoEvalData *evaldata) oldcxt = MemoryContextSwitchTo(mycontext); /* - * preserve root->join_rel_list, which gimme_tree changes; without - * this, it'll be pointing at recycled storage after the - * MemoryContextDelete below. + * gimme_tree will add entries to root->join_rel_list, which may or may + * not already contain some entries. The newly added entries will be + * recycled by the MemoryContextDelete below, so we must ensure that + * the list is restored to its former state before exiting. With the + * new List implementation, the easiest way is to make a duplicate list + * that gimme_tree can modify. */ savelist = evaldata->root->join_rel_list; + evaldata->root->join_rel_list = list_copy(savelist); + /* construct the best path for the given combination of relations */ joinrel = gimme_tree(tour, num_gene, evaldata); -- GitLab