3939double predicted_ppi_rows ;
4040double fss_ppi_hash ;
4141
42+ /*
43+ * Cardinality prediction hooks.
44+ * It isn't clear what to do if someone else tries to live in this chain.
45+ * Of course, someone may want to just report some stat or something like that.
46+ * So, it can be legal, sometimees. So far, we only report this fact.
47+ */
4248static set_baserel_rows_estimate_hook_type aqo_set_baserel_rows_estimate_next = NULL ;
4349static get_parameterized_baserel_size_hook_type aqo_get_parameterized_baserel_size_next = NULL ;
4450static set_joinrel_size_estimates_hook_type aqo_set_joinrel_size_estimates_next = NULL ;
@@ -94,12 +100,17 @@ aqo_set_baserel_rows_estimate(PlannerInfo *root, RelOptInfo *rel)
94100/* Return to the caller's memory context. */
95101MemoryContextSwitchTo (old_ctx_m );
96102
97- if (predicted >=0 )
98- {
99- rel -> rows = predicted ;
100- rel -> predicted_cardinality = predicted ;
101- return ;
102- }
103+ if (predicted < 0 )
104+ gotodefault_estimator ;
105+
106+ if ((aqo_set_baserel_rows_estimate_next != set_baserel_rows_estimate_standard ||
107+ set_baserel_rows_estimate_hook != aqo_set_baserel_rows_estimate ))
108+ /* It is unclear that to do in situation of such kind. Just report it */
109+ elog (WARNING ,"AQO is in the middle of the set_baserel_rows_estimate_hook chain" );
110+
111+ rel -> rows = predicted ;
112+ rel -> predicted_cardinality = predicted ;
113+ return ;
103114
104115default_estimator :
105116rel -> predicted_cardinality = -1. ;
@@ -115,6 +126,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
115126if (IsQueryDisabled ())
116127return ;
117128
129+ if ((aqo_set_parampathinfo_postinit_next != NULL ||
130+ parampathinfo_postinit_hook != aqo_parampathinfo_postinit ))
131+ /* It is unclear that to do in situation of such kind. Just report it */
132+ elog (WARNING ,"AQO is in the middle of the parampathinfo_postinit_hook chain" );
133+
118134ppi -> predicted_ppi_rows = predicted_ppi_rows ;
119135ppi -> fss_ppi_hash = fss_ppi_hash ;
120136}
@@ -198,8 +214,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
198214predicted_ppi_rows = predicted ;
199215fss_ppi_hash = fss ;
200216
201- if (predicted >=0 )
202- return predicted ;
217+ if (predicted < 0 )
218+ gotodefault_estimator ;
219+
220+ if ((aqo_get_parameterized_baserel_size_next != get_parameterized_baserel_size_standard ||
221+ get_parameterized_baserel_size_hook != aqo_get_parameterized_baserel_size ))
222+ /* It is unclear that to do in situation of such kind. Just report it */
223+ elog (WARNING ,"AQO is in the middle of the aqo_get_parameterized_baserel_size_next chain" );
224+
225+ return predicted ;
203226
204227default_estimator :
205228return aqo_get_parameterized_baserel_size_next (root ,rel ,param_clauses );
@@ -263,12 +286,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
263286
264287rel -> fss_hash = fss ;
265288
266- if (predicted >=0 )
267- {
268- rel -> predicted_cardinality = predicted ;
269- rel -> rows = predicted ;
270- return ;
271- }
289+ if (predicted < 0 )
290+ gotodefault_estimator ;
291+
292+ if ((aqo_set_joinrel_size_estimates_next != set_joinrel_size_estimates_standard ||
293+ set_joinrel_size_estimates_hook != aqo_set_joinrel_size_estimates ))
294+ /* It is unclear that to do in situation of such kind. Just report it */
295+ elog (WARNING ,"AQO is in the middle of the set_joinrel_size_estimates_hook chain" );
296+
297+ rel -> predicted_cardinality = predicted ;
298+ rel -> rows = predicted ;
299+ return ;
272300
273301default_estimator :
274302rel -> predicted_cardinality = -1 ;
@@ -334,8 +362,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
334362predicted_ppi_rows = predicted ;
335363fss_ppi_hash = fss ;
336364
337- if (predicted >=0 )
338- return predicted ;
365+ if (predicted < 0 )
366+ gotodefault_estimator ;
367+
368+ if ((aqo_get_parameterized_joinrel_size_next != get_parameterized_joinrel_size_standard ||
369+ get_parameterized_joinrel_size_hook != aqo_get_parameterized_joinrel_size ))
370+ /* It is unclear that to do in situation of such kind. Just report it */
371+ elog (WARNING ,"AQO is in the middle of the get_parameterized_joinrel_size_hook chain" );
372+
373+ return predicted ;
339374
340375default_estimator :
341376return aqo_get_parameterized_joinrel_size_next (root ,rel ,
@@ -393,8 +428,10 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
393428/* XXX: Don't support some GROUPING options */
394429gotodefault_estimator ;
395430
396- if (aqo_estimate_num_groups_next != NULL )
397- elog (WARNING ,"AQO replaced another estimator of a groups number" );
431+ if (aqo_estimate_num_groups_next != NULL ||
432+ estimate_num_groups_hook != aqo_estimate_num_groups )
433+ /* It is unclear that to do in situation of such kind. Just report it */
434+ elog (WARNING ,"AQO is in the middle of the estimate_num_groups_hook chain" );
398435
399436if (groupExprs == NIL )
400437return 1.0 ;
@@ -431,29 +468,28 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
431468void
432469aqo_cardinality_hooks_init (void )
433470{
434-
435- /* Cardinality prediction hooks. */
436- aqo_set_baserel_rows_estimate_next = set_baserel_rows_estimate_hook ?
437- set_baserel_rows_estimate_hook :
438- set_baserel_rows_estimate_standard ;
471+ if (set_baserel_rows_estimate_hook ||
472+ set_foreign_rows_estimate_hook ||
473+ get_parameterized_baserel_size_hook ||
474+ set_joinrel_size_estimates_hook ||
475+ get_parameterized_joinrel_size_hook ||
476+ parampathinfo_postinit_hook ||
477+ estimate_num_groups_hook )
478+ elog (ERROR ,"AQO estimation hooks shouldn't be intercepted" );
479+
480+ aqo_set_baserel_rows_estimate_next = set_baserel_rows_estimate_standard ;
439481set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
440482
441483/* XXX: we have a problem here. Should be redesigned later */
442484set_foreign_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
443485
444- aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_hook ?
445- get_parameterized_baserel_size_hook :
446- get_parameterized_baserel_size_standard ;
486+ aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_standard ;
447487get_parameterized_baserel_size_hook = aqo_get_parameterized_baserel_size ;
448488
449- aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_hook ?
450- set_joinrel_size_estimates_hook :
451- set_joinrel_size_estimates_standard ;
489+ aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_standard ;
452490set_joinrel_size_estimates_hook = aqo_set_joinrel_size_estimates ;
453491
454- aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_hook ?
455- get_parameterized_joinrel_size_hook :
456- get_parameterized_joinrel_size_standard ;
492+ aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_standard ;
457493get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size ;
458494
459495aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook ;