@@ -40,6 +40,12 @@ double predicted_ppi_rows;
4040double fss_ppi_hash ;
4141
4242
43+ /*
44+ * Cardinality prediction hooks.
45+ * It isn't clear what to do if someone else tries to live in this chain.
46+ * Of course, someone may want to just report some stat or something like that.
47+ * So, it can be legal, sometimees. So far, we only report this fact.
48+ */
4349static set_baserel_rows_estimate_hook_type aqo_set_baserel_rows_estimate_next = NULL ;
4450static get_parameterized_baserel_size_hook_type aqo_get_parameterized_baserel_size_next = NULL ;
4551static set_joinrel_size_estimates_hook_type aqo_set_joinrel_size_estimates_next = NULL ;
@@ -95,12 +101,17 @@ aqo_set_baserel_rows_estimate(PlannerInfo *root, RelOptInfo *rel)
95101/* Return to the caller's memory context. */
96102MemoryContextSwitchTo (old_ctx_m );
97103
98- if (predicted >=0 )
99- {
100- rel -> rows = predicted ;
101- rel -> predicted_cardinality = predicted ;
102- return ;
103- }
104+ if (predicted < 0 )
105+ gotodefault_estimator ;
106+
107+ if ((aqo_set_baserel_rows_estimate_next != set_baserel_rows_estimate_standard ||
108+ set_baserel_rows_estimate_hook != aqo_set_baserel_rows_estimate ))
109+ /* It is unclear that to do in situation of such kind. Just report it */
110+ elog (WARNING ,"AQO is in the middle of the set_baserel_rows_estimate_hook chain" );
111+
112+ rel -> rows = predicted ;
113+ rel -> predicted_cardinality = predicted ;
114+ return ;
104115
105116default_estimator :
106117rel -> predicted_cardinality = -1. ;
@@ -116,6 +127,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
116127if (IsQueryDisabled ())
117128return ;
118129
130+ if ((aqo_set_parampathinfo_postinit_next != NULL ||
131+ parampathinfo_postinit_hook != aqo_parampathinfo_postinit ))
132+ /* It is unclear that to do in situation of such kind. Just report it */
133+ elog (WARNING ,"AQO is in the middle of the parampathinfo_postinit_hook chain" );
134+
119135ppi -> predicted_ppi_rows = predicted_ppi_rows ;
120136ppi -> fss_ppi_hash = fss_ppi_hash ;
121137}
@@ -199,8 +215,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
199215predicted_ppi_rows = predicted ;
200216fss_ppi_hash = fss ;
201217
202- if (predicted >=0 )
203- return predicted ;
218+ if (predicted < 0 )
219+ gotodefault_estimator ;
220+
221+ if ((aqo_get_parameterized_baserel_size_next != get_parameterized_baserel_size_standard ||
222+ get_parameterized_baserel_size_hook != aqo_get_parameterized_baserel_size ))
223+ /* It is unclear that to do in situation of such kind. Just report it */
224+ elog (WARNING ,"AQO is in the middle of the aqo_get_parameterized_baserel_size_next chain" );
225+
226+ return predicted ;
204227
205228default_estimator :
206229return aqo_get_parameterized_baserel_size_next (root ,rel ,param_clauses );
@@ -264,12 +287,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
264287
265288rel -> fss_hash = fss ;
266289
267- if (predicted >=0 )
268- {
269- rel -> predicted_cardinality = predicted ;
270- rel -> rows = predicted ;
271- return ;
272- }
290+ if (predicted < 0 )
291+ gotodefault_estimator ;
292+
293+ if ((aqo_set_joinrel_size_estimates_next != set_joinrel_size_estimates_standard ||
294+ set_joinrel_size_estimates_hook != aqo_set_joinrel_size_estimates ))
295+ /* It is unclear that to do in situation of such kind. Just report it */
296+ elog (WARNING ,"AQO is in the middle of the set_joinrel_size_estimates_hook chain" );
297+
298+ rel -> predicted_cardinality = predicted ;
299+ rel -> rows = predicted ;
300+ return ;
273301
274302default_estimator :
275303rel -> predicted_cardinality = -1 ;
@@ -335,8 +363,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
335363predicted_ppi_rows = predicted ;
336364fss_ppi_hash = fss ;
337365
338- if (predicted >=0 )
339- return predicted ;
366+ if (predicted < 0 )
367+ gotodefault_estimator ;
368+
369+ if ((aqo_get_parameterized_joinrel_size_next != get_parameterized_joinrel_size_standard ||
370+ get_parameterized_joinrel_size_hook != aqo_get_parameterized_joinrel_size ))
371+ /* It is unclear that to do in situation of such kind. Just report it */
372+ elog (WARNING ,"AQO is in the middle of the get_parameterized_joinrel_size_hook chain" );
373+
374+ return predicted ;
340375
341376default_estimator :
342377return aqo_get_parameterized_joinrel_size_next (root ,rel ,
@@ -394,13 +429,15 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
394429/* XXX: Don't support some GROUPING options */
395430gotodefault_estimator ;
396431
397- if (aqo_estimate_num_groups_next != NULL )
398- elog (WARNING ,"AQO replaced another estimator of a groups number" );
399-
400432/* Zero the estinfo output parameter, if non-NULL */
401433if (estinfo != NULL )
402434memset (estinfo ,0 ,sizeof (EstimationInfo ));
403435
436+ if (aqo_estimate_num_groups_next != NULL ||
437+ estimate_num_groups_hook != aqo_estimate_num_groups )
438+ /* It is unclear that to do in situation of such kind. Just report it */
439+ elog (WARNING ,"AQO is in the middle of the estimate_num_groups_hook chain" );
440+
404441if (groupExprs == NIL )
405442return 1.0 ;
406443
@@ -436,29 +473,28 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
436473void
437474aqo_cardinality_hooks_init (void )
438475{
439-
440- /* Cardinality prediction hooks. */
441- aqo_set_baserel_rows_estimate_next = set_baserel_rows_estimate_hook ?
442- set_baserel_rows_estimate_hook :
443- set_baserel_rows_estimate_standard ;
476+ if (set_baserel_rows_estimate_hook ||
477+ set_foreign_rows_estimate_hook ||
478+ get_parameterized_baserel_size_hook ||
479+ set_joinrel_size_estimates_hook ||
480+ get_parameterized_joinrel_size_hook ||
481+ parampathinfo_postinit_hook ||
482+ estimate_num_groups_hook )
483+ elog (ERROR ,"AQO estimation hooks shouldn't be intercepted" );
484+
485+ aqo_set_baserel_rows_estimate_next = set_baserel_rows_estimate_standard ;
444486set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
445487
446488/* XXX: we have a problem here. Should be redesigned later */
447489set_foreign_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
448490
449- aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_hook ?
450- get_parameterized_baserel_size_hook :
451- get_parameterized_baserel_size_standard ;
491+ aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_standard ;
452492get_parameterized_baserel_size_hook = aqo_get_parameterized_baserel_size ;
453493
454- aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_hook ?
455- set_joinrel_size_estimates_hook :
456- set_joinrel_size_estimates_standard ;
494+ aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_standard ;
457495set_joinrel_size_estimates_hook = aqo_set_joinrel_size_estimates ;
458496
459- aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_hook ?
460- get_parameterized_joinrel_size_hook :
461- get_parameterized_joinrel_size_standard ;
497+ aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_standard ;
462498get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size ;
463499
464500aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook ;