Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit b16e852

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 687b868 commit b16e852

File tree

1 file changed

+66
-32
lines changed

1 file changed

+66
-32
lines changed

cardinality_hooks.c

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,17 @@ aqo_set_baserel_rows_estimate(PlannerInfo *root, RelOptInfo *rel)
9494
/* Return to the caller's memory context. */
9595
MemoryContextSwitchTo(old_ctx_m);
9696

97-
if (predicted >= 0)
98-
{
99-
rel->rows = predicted;
100-
rel->predicted_cardinality = predicted;
101-
return;
102-
}
97+
if (predicted < 0)
98+
goto default_estimator;
99+
100+
if ((aqo_set_baserel_rows_estimate_next != set_baserel_rows_estimate_standard ||
101+
set_baserel_rows_estimate_hook != aqo_set_baserel_rows_estimate))
102+
/* It is unclear that to do in situation of such kind. Just report it */
103+
elog(WARNING, "AQO is in the middle of the set_baserel_rows_estimate_hook chain");
104+
105+
rel->rows = predicted;
106+
rel->predicted_cardinality = predicted;
107+
return;
103108

104109
default_estimator:
105110
rel->predicted_cardinality = -1.;
@@ -115,6 +120,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
115120
if (IsQueryDisabled())
116121
return;
117122

123+
if ((aqo_set_parampathinfo_postinit_next != NULL ||
124+
parampathinfo_postinit_hook != aqo_parampathinfo_postinit))
125+
/* It is unclear that to do in situation of such kind. Just report it */
126+
elog(WARNING, "AQO is in the middle of the parampathinfo_postinit_hook chain");
127+
118128
ppi->predicted_ppi_rows = predicted_ppi_rows;
119129
ppi->fss_ppi_hash = fss_ppi_hash;
120130
}
@@ -198,8 +208,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
198208
predicted_ppi_rows = predicted;
199209
fss_ppi_hash = fss;
200210

201-
if (predicted >= 0)
202-
return predicted;
211+
if (predicted < 0)
212+
goto default_estimator;
213+
214+
if ((aqo_get_parameterized_baserel_size_next != get_parameterized_baserel_size_standard ||
215+
get_parameterized_baserel_size_hook != aqo_get_parameterized_baserel_size))
216+
/* It is unclear that to do in situation of such kind. Just report it */
217+
elog(WARNING, "AQO is in the middle of the aqo_get_parameterized_baserel_size_next chain");
218+
219+
return predicted;
203220

204221
default_estimator:
205222
return aqo_get_parameterized_baserel_size_next(root, rel, param_clauses);
@@ -263,12 +280,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
263280

264281
rel->fss_hash = fss;
265282

266-
if (predicted >= 0)
267-
{
268-
rel->predicted_cardinality = predicted;
269-
rel->rows = predicted;
270-
return;
271-
}
283+
if (predicted < 0)
284+
goto default_estimator;
285+
286+
if ((aqo_set_joinrel_size_estimates_next != set_joinrel_size_estimates_standard ||
287+
set_joinrel_size_estimates_hook != aqo_set_joinrel_size_estimates))
288+
/* It is unclear that to do in situation of such kind. Just report it */
289+
elog(WARNING, "AQO is in the middle of the set_joinrel_size_estimates_hook chain");
290+
291+
rel->predicted_cardinality = predicted;
292+
rel->rows = predicted;
293+
return;
272294

273295
default_estimator:
274296
rel->predicted_cardinality = -1;
@@ -334,8 +356,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
334356
predicted_ppi_rows = predicted;
335357
fss_ppi_hash = fss;
336358

337-
if (predicted >= 0)
338-
return predicted;
359+
if (predicted < 0)
360+
goto default_estimator;
361+
362+
if ((aqo_get_parameterized_joinrel_size_next != get_parameterized_joinrel_size_standard ||
363+
get_parameterized_joinrel_size_hook != aqo_get_parameterized_joinrel_size))
364+
/* It is unclear that to do in situation of such kind. Just report it */
365+
elog(WARNING, "AQO is in the middle of the get_parameterized_joinrel_size_hook chain");
366+
367+
return predicted;
339368

340369
default_estimator:
341370
return aqo_get_parameterized_joinrel_size_next(root, rel,
@@ -393,8 +422,14 @@ aqo_estimate_num_groups_hook(PlannerInfo *root, List *groupExprs,
393422
/* XXX: Don't support some GROUPING options */
394423
goto default_estimator;
395424

396-
if (aqo_estimate_num_groups_next != NULL)
397-
elog(WARNING, "AQO replaced another estimator of a groups number");
425+
/* Zero the estinfo output parameter, if non-NULL */
426+
if (estinfo != NULL)
427+
memset(estinfo, 0, sizeof(EstimationInfo));
428+
429+
if (aqo_estimate_num_groups_next != NULL ||
430+
estimate_num_groups_hook != aqo_estimate_num_groups)
431+
/* It is unclear that to do in situation of such kind. Just report it */
432+
elog(WARNING, "AQO is in the middle of the estimate_num_groups_hook chain");
398433

399434
if (groupExprs == NIL)
400435
return 1.0;
@@ -431,29 +466,28 @@ aqo_estimate_num_groups_hook(PlannerInfo *root, List *groupExprs,
431466
void
432467
aqo_cardinality_hooks_init(void)
433468
{
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;
469+
if (set_baserel_rows_estimate_hook ||
470+
set_foreign_rows_estimate_hook ||
471+
get_parameterized_baserel_size_hook ||
472+
set_joinrel_size_estimates_hook ||
473+
get_parameterized_joinrel_size_hook ||
474+
parampathinfo_postinit_hook ||
475+
estimate_num_groups_hook)
476+
elog(ERROR, "AQO estimation hooks shouldn't be intercepted");
477+
478+
aqo_set_baserel_rows_estimate_next = set_baserel_rows_estimate_standard;
439479
set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate;
440480

441481
/* XXX: we have a problem here. Should be redesigned later */
442482
set_foreign_rows_estimate_hook = aqo_set_baserel_rows_estimate;
443483

444-
aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_hook ?
445-
get_parameterized_baserel_size_hook :
446-
get_parameterized_baserel_size_standard;
484+
aqo_get_parameterized_baserel_size_next = get_parameterized_baserel_size_standard;
447485
get_parameterized_baserel_size_hook = aqo_get_parameterized_baserel_size;
448486

449-
aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_hook ?
450-
set_joinrel_size_estimates_hook :
451-
set_joinrel_size_estimates_standard;
487+
aqo_set_joinrel_size_estimates_next = set_joinrel_size_estimates_standard;
452488
set_joinrel_size_estimates_hook = aqo_set_joinrel_size_estimates;
453489

454-
aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_hook ?
455-
get_parameterized_joinrel_size_hook :
456-
get_parameterized_joinrel_size_standard;
490+
aqo_get_parameterized_joinrel_size_next = get_parameterized_joinrel_size_standard;
457491
get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size;
458492

459493
aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook;

0 commit comments

Comments
 (0)