summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/geqo
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/geqo')
-rw-r--r--src/backend/optimizer/geqo/geqo_eval.c2
-rw-r--r--src/backend/optimizer/geqo/geqo_main.c12
-rw-r--r--src/backend/optimizer/geqo/geqo_random.c7
3 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c
index f07d1dc8ac6..7fcb1aa70d1 100644
--- a/src/backend/optimizer/geqo/geqo_eval.c
+++ b/src/backend/optimizer/geqo/geqo_eval.c
@@ -162,7 +162,7 @@ geqo_eval(PlannerInfo *root, Gene *tour, int num_gene)
RelOptInfo *
gimme_tree(PlannerInfo *root, Gene *tour, int num_gene)
{
- GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
+ GeqoPrivateData *private = GetGeqoPrivateData(root);
List *clumps;
int rel_count;
diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c
index 38402ce58db..0064556087a 100644
--- a/src/backend/optimizer/geqo/geqo_main.c
+++ b/src/backend/optimizer/geqo/geqo_main.c
@@ -47,6 +47,8 @@ int Geqo_generations;
double Geqo_selection_bias;
double Geqo_seed;
+/* GEQO is treated as an in-core planner extension */
+int Geqo_planner_extension_id = -1;
static int gimme_pool_size(int nr_rel);
static int gimme_number_generations(int pool_size);
@@ -98,10 +100,16 @@ geqo(PlannerInfo *root, int number_of_rels, List *initial_rels)
int mutations = 0;
#endif
+ if (Geqo_planner_extension_id < 0)
+ Geqo_planner_extension_id = GetPlannerExtensionId("geqo");
+
/* set up private information */
- root->join_search_private = &private;
+ SetPlannerInfoExtensionState(root, Geqo_planner_extension_id, &private);
private.initial_rels = initial_rels;
+/* inform core planner that we may replan */
+ root->assumeReplanning = true;
+
/* initialize private number generator */
geqo_set_seed(root, Geqo_seed);
@@ -304,7 +312,7 @@ geqo(PlannerInfo *root, int number_of_rels, List *initial_rels)
free_pool(root, pool);
/* ... clear root pointer to our private storage */
- root->join_search_private = NULL;
+ SetPlannerInfoExtensionState(root, Geqo_planner_extension_id, NULL);
return best_rel;
}
diff --git a/src/backend/optimizer/geqo/geqo_random.c b/src/backend/optimizer/geqo/geqo_random.c
index 6c7a411f69f..46d28baa2e6 100644
--- a/src/backend/optimizer/geqo/geqo_random.c
+++ b/src/backend/optimizer/geqo/geqo_random.c
@@ -15,11 +15,10 @@
#include "optimizer/geqo_random.h"
-
void
geqo_set_seed(PlannerInfo *root, double seed)
{
- GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
+ GeqoPrivateData *private = GetGeqoPrivateData(root);
pg_prng_fseed(&private->random_state, seed);
}
@@ -27,7 +26,7 @@ geqo_set_seed(PlannerInfo *root, double seed)
double
geqo_rand(PlannerInfo *root)
{
- GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
+ GeqoPrivateData *private = GetGeqoPrivateData(root);
return pg_prng_double(&private->random_state);
}
@@ -35,7 +34,7 @@ geqo_rand(PlannerInfo *root)
int
geqo_randint(PlannerInfo *root, int upper, int lower)
{
- GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private;
+ GeqoPrivateData *private = GetGeqoPrivateData(root);
/*
* In current usage, "lower" is never negative so we can just use