39
39
double predicted_ppi_rows ;
40
40
double fss_ppi_hash ;
41
41
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
+ */
42
48
static set_baserel_rows_estimate_hook_type aqo_set_baserel_rows_estimate_next = NULL ;
43
49
static get_parameterized_baserel_size_hook_type aqo_get_parameterized_baserel_size_next = NULL ;
44
50
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)
94
100
/* Return to the caller's memory context. */
95
101
MemoryContextSwitchTo (old_ctx_m );
96
102
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 ;
103
114
104
115
default_estimator :
105
116
rel -> predicted_cardinality = -1. ;
@@ -115,6 +126,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
115
126
if (IsQueryDisabled ())
116
127
return ;
117
128
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
+
118
134
ppi -> predicted_ppi_rows = predicted_ppi_rows ;
119
135
ppi -> fss_ppi_hash = fss_ppi_hash ;
120
136
}
@@ -198,8 +214,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
198
214
predicted_ppi_rows = predicted ;
199
215
fss_ppi_hash = fss ;
200
216
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 ;
203
226
204
227
default_estimator :
205
228
return aqo_get_parameterized_baserel_size_next (root , rel , param_clauses );
@@ -263,12 +286,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
263
286
264
287
rel -> fss_hash = fss ;
265
288
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 ;
272
300
273
301
default_estimator :
274
302
rel -> predicted_cardinality = -1 ;
@@ -334,8 +362,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
334
362
predicted_ppi_rows = predicted ;
335
363
fss_ppi_hash = fss ;
336
364
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 ;
339
374
340
375
default_estimator :
341
376
return aqo_get_parameterized_joinrel_size_next (root , rel ,
@@ -393,8 +428,10 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
393
428
/* XXX: Don't support some GROUPING options */
394
429
goto default_estimator ;
395
430
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" );
398
435
399
436
if (groupExprs == NIL )
400
437
return 1.0 ;
@@ -431,29 +468,28 @@ aqo_estimate_num_groups(PlannerInfo *root, List *groupExprs,
431
468
void
432
469
aqo_cardinality_hooks_init (void )
433
470
{
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 ;
439
481
set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
440
482
441
483
/* XXX: we have a problem here. Should be redesigned later */
442
484
set_foreign_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
443
485
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 ;
447
487
get_parameterized_baserel_size_hook = aqo_get_parameterized_baserel_size ;
448
488
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 ;
452
490
set_joinrel_size_estimates_hook = aqo_set_joinrel_size_estimates ;
453
491
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 ;
457
493
get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size ;
458
494
459
495
aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook ;
0 commit comments