@@ -94,12 +94,17 @@ aqo_set_baserel_rows_estimate(PlannerInfo *root, RelOptInfo *rel)
94
94
/* Return to the caller's memory context. */
95
95
MemoryContextSwitchTo (old_ctx_m );
96
96
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 ;
103
108
104
109
default_estimator :
105
110
rel -> predicted_cardinality = -1. ;
@@ -115,6 +120,11 @@ aqo_parampathinfo_postinit(ParamPathInfo *ppi)
115
120
if (IsQueryDisabled ())
116
121
return ;
117
122
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
+
118
128
ppi -> predicted_ppi_rows = predicted_ppi_rows ;
119
129
ppi -> fss_ppi_hash = fss_ppi_hash ;
120
130
}
@@ -198,8 +208,15 @@ aqo_get_parameterized_baserel_size(PlannerInfo *root,
198
208
predicted_ppi_rows = predicted ;
199
209
fss_ppi_hash = fss ;
200
210
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 ;
203
220
204
221
default_estimator :
205
222
return aqo_get_parameterized_baserel_size_next (root , rel , param_clauses );
@@ -263,12 +280,17 @@ aqo_set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,
263
280
264
281
rel -> fss_hash = fss ;
265
282
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 ;
272
294
273
295
default_estimator :
274
296
rel -> predicted_cardinality = -1 ;
@@ -334,8 +356,15 @@ aqo_get_parameterized_joinrel_size(PlannerInfo *root,
334
356
predicted_ppi_rows = predicted ;
335
357
fss_ppi_hash = fss ;
336
358
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 ;
339
368
340
369
default_estimator :
341
370
return aqo_get_parameterized_joinrel_size_next (root , rel ,
@@ -393,8 +422,14 @@ aqo_estimate_num_groups_hook(PlannerInfo *root, List *groupExprs,
393
422
/* XXX: Don't support some GROUPING options */
394
423
goto default_estimator ;
395
424
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" );
398
433
399
434
if (groupExprs == NIL )
400
435
return 1.0 ;
@@ -431,29 +466,28 @@ aqo_estimate_num_groups_hook(PlannerInfo *root, List *groupExprs,
431
466
void
432
467
aqo_cardinality_hooks_init (void )
433
468
{
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 ;
439
479
set_baserel_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
440
480
441
481
/* XXX: we have a problem here. Should be redesigned later */
442
482
set_foreign_rows_estimate_hook = aqo_set_baserel_rows_estimate ;
443
483
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 ;
447
485
get_parameterized_baserel_size_hook = aqo_get_parameterized_baserel_size ;
448
486
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 ;
452
488
set_joinrel_size_estimates_hook = aqo_set_joinrel_size_estimates ;
453
489
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 ;
457
491
get_parameterized_joinrel_size_hook = aqo_get_parameterized_joinrel_size ;
458
492
459
493
aqo_set_parampathinfo_postinit_next = parampathinfo_postinit_hook ;
0 commit comments