|
6 | 6 | * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group |
7 | 7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | 8 | * |
9 | | - * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_eval.c,v 1.71 2004/08/29 05:06:43 momjian Exp $ |
| 9 | + * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_eval.c,v 1.72 2004/12/15 21:13:34 tgl Exp $ |
10 | 10 | * |
11 | 11 | *------------------------------------------------------------------------- |
12 | 12 | */ |
@@ -80,12 +80,17 @@ geqo_eval(Gene *tour, int num_gene, GeqoEvalData *evaldata) |
80 | 80 | oldcxt=MemoryContextSwitchTo(mycontext); |
81 | 81 |
|
82 | 82 | /* |
83 | | - * preserve root->join_rel_list, which gimme_tree changes; without |
84 | | - * this, it'll be pointing at recycled storage after the |
85 | | - * MemoryContextDelete below. |
| 83 | + * gimme_tree will add entries to root->join_rel_list, which may or may |
| 84 | + * not already contain some entries. The newly added entries will be |
| 85 | + * recycled by the MemoryContextDelete below, so we must ensure that |
| 86 | + * the list is restored to its former state before exiting. With the |
| 87 | + * new List implementation, the easiest way is to make a duplicate list |
| 88 | + * that gimme_tree can modify. |
86 | 89 | */ |
87 | 90 | savelist=evaldata->root->join_rel_list; |
88 | 91 |
|
| 92 | +evaldata->root->join_rel_list=list_copy(savelist); |
| 93 | + |
89 | 94 | /* construct the best path for the given combination of relations */ |
90 | 95 | joinrel=gimme_tree(tour,num_gene,evaldata); |
91 | 96 |
|
|