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

Commite1761d4

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 parent3207d62 commite1761d4

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
doublepredicted_ppi_rows;
4040
doublefss_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
staticset_baserel_rows_estimate_hook_typeaqo_set_baserel_rows_estimate_next=NULL;
4349
staticget_parameterized_baserel_size_hook_typeaqo_get_parameterized_baserel_size_next=NULL;
4450
staticset_joinrel_size_estimates_hook_typeaqo_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+
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

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-
returnpredicted;
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+
returnpredicted;
203226

204227
default_estimator:
205228
returnaqo_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+
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

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-
returnpredicted;
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+
returnpredicted;
339374

340375
default_estimator:
341376
returnaqo_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
gotodefault_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
return1.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)

[8]ページ先頭

©2009-2025 Movatter.jp