Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitee4ffc5

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 parent5437c07 commitee4ffc5

File tree

1 file changed

+69
-33
lines changed

1 file changed

+69
-33
lines changed

‎cardinality_hooks.c

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ double predicted_ppi_rows;
4040
doublefss_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+
*/
4349
staticset_baserel_rows_estimate_hook_typeaqo_set_baserel_rows_estimate_next=NULL;
4450
staticget_parameterized_baserel_size_hook_typeaqo_get_parameterized_baserel_size_next=NULL;
4551
staticset_joinrel_size_estimates_hook_typeaqo_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. */
96102
MemoryContextSwitchTo(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

105116
default_estimator:
106117
rel->predicted_cardinality=-1.;
@@ -116,6 +127,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
116127
if (IsQueryDisabled())
117128
return;
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+
119135
ppi->predicted_ppi_rows=predicted_ppi_rows;
120136
ppi->fss_ppi_hash=fss_ppi_hash;
121137
}
@@ -199,8 +215,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
199215
predicted_ppi_rows=predicted;
200216
fss_ppi_hash=fss;
201217

202-
if (predicted >=0)
203-
returnpredicted;
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+
returnpredicted;
204227

205228
default_estimator:
206229
returnaqo_get_parameterized_baserel_size_next(root,rel,param_clauses);
@@ -264,12 +287,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
264287

265288
rel->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

274302
default_estimator:
275303
rel->predicted_cardinality=-1;
@@ -335,8 +363,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
335363
predicted_ppi_rows=predicted;
336364
fss_ppi_hash=fss;
337365

338-
if (predicted >=0)
339-
returnpredicted;
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+
returnpredicted;
340375

341376
default_estimator:
342377
returnaqo_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 */
395430
gotodefault_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 */
401433
if (estinfo!=NULL)
402434
memset(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+
404441
if (groupExprs==NIL)
405442
return1.0;
406443

@@ -436,29 +473,28 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
436473
void
437474
aqo_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;
444486
set_baserel_rows_estimate_hook=aqo_set_baserel_rows_estimate;
445487

446488
/* XXX: we have a problem here. Should be redesigned later */
447489
set_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;
452492
get_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;
457495
set_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;
462498
get_parameterized_joinrel_size_hook=aqo_get_parameterized_joinrel_size;
463499

464500
aqo_set_parampathinfo_postinit_next=parampathinfo_postinit_hook;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp