Skip to content

Commit e1761d4

Browse files
committed
Enhancement. Report if someone external inserted a hook into the chain of AQO prediction hooks. It isn't a strict rule, but we should know about that.
1 parent 3207d62 commit e1761d4

File tree

1 file changed

+68
-32
lines changed

1 file changed

+68
-32
lines changed

cardinality_hooks.c

Lines changed: 68 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
double predicted_ppi_rows;
4040
double 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+
*/
4248
static set_baserel_rows_estimate_hook_type aqo_set_baserel_rows_estimate_next = NULL;
4349
static get_parameterized_baserel_size_hook_type aqo_get_parameterized_baserel_size_next = NULL;
4450
static 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. */
95101
MemoryContextSwitchTo(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+
goto default_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

104115
default_estimator:
105116
rel->predicted_cardinality = -1.;
@@ -115,6 +126,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
115126
if (IsQueryDisabled())
116127
return;
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+
118134
ppi->predicted_ppi_rows = predicted_ppi_rows;
119135
ppi->fss_ppi_hash = fss_ppi_hash;
120136
}
@@ -198,8 +214,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
198214
predicted_ppi_rows = predicted;
199215
fss_ppi_hash = fss;
200216

201-
if (predicted >= 0)
202-
return predicted;
217+
if (predicted < 0)
218+
goto default_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

204227
default_estimator:
205228
return aqo_get_parameterized_baserel_size_next(root, rel, param_clauses);
@@ -263,12 +286,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
263286

264287
rel->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+
goto default_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

273301
default_estimator:
274302
rel->predicted_cardinality = -1;
@@ -334,8 +362,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
334362
predicted_ppi_rows = predicted;
335363
fss_ppi_hash = fss;
336364

337-
if (predicted >= 0)
338-
return predicted;
365+
if (predicted < 0)
366+
goto default_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

340375
default_estimator:
341376
return 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 */
394429
goto default_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

399436
if (groupExprs == NIL)
400437
return 1.0;
@@ -431,29 +468,28 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
431468
void
432469
aqo_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;
439481
set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate;
440482

441483
/* XXX: we have a problem here. Should be redesigned later */
442484
set_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;
447487
get_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;
452490
set_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;
457493
get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size;
458494

459495
aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook;

0 commit comments

Comments
 (0)