| 31553 | */ |
| 31554 | |
| 31555 | bool save_agg_explain_data(JOIN *join, Explain_select *xpl_sel) |
| 31556 | { |
| 31557 | JOIN_TAB *join_tab=join->join_tab + join->exec_join_tab_cnt(); |
| 31558 | Explain_aggr_node *prev_node; |
| 31559 | Explain_aggr_node *node= xpl_sel->aggr_tree; |
| 31560 | bool is_analyze= join->thd->lex->analyze_stmt; |
| 31561 | THD *thd= join->thd; |
| 31562 | |
| 31563 | for (uint i= 0; i < join->aggr_tables; i++, join_tab++) |
| 31564 | { |
| 31565 | // Each aggregate means a temp.table |
| 31566 | prev_node= node; |
| 31567 | if (!(node= new (thd->mem_root) Explain_aggr_tmp_table)) |
| 31568 | return 1; |
| 31569 | node->child= prev_node; |
| 31570 | |
| 31571 | if (join_tab->window_funcs_step) |
| 31572 | { |
| 31573 | Explain_aggr_node *new_node= |
| 31574 | join_tab->window_funcs_step->save_explain_plan(thd->mem_root, |
| 31575 | is_analyze); |
| 31576 | if (!new_node) |
| 31577 | return 1; |
| 31578 | |
| 31579 | prev_node=node; |
| 31580 | node= new_node; |
| 31581 | node->child= prev_node; |
| 31582 | } |
| 31583 | |
| 31584 | /* The below matches execution in join_init_read_record() */ |
| 31585 | if (join_tab->distinct) |
| 31586 | { |
| 31587 | prev_node= node; |
| 31588 | if (!(node= new (thd->mem_root) Explain_aggr_remove_dups)) |
| 31589 | return 1; |
| 31590 | node->child= prev_node; |
| 31591 | } |
| 31592 | |
| 31593 | if (join_tab->filesort) |
| 31594 | { |
| 31595 | Explain_aggr_filesort *eaf = |
| 31596 | new (thd->mem_root) Explain_aggr_filesort(thd->mem_root, is_analyze, join_tab->filesort); |
| 31597 | if (!eaf) |
| 31598 | return 1; |
| 31599 | prev_node= node; |
| 31600 | node= eaf; |
| 31601 | node->child= prev_node; |
| 31602 | } |
| 31603 | } |
| 31604 | xpl_sel->aggr_tree= node; |
| 31605 | return 0; |
| 31606 | } |
| 31607 | |
| 31608 | |
| 31609 | /** |
no test coverage detected