diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ed91719fd46..d0f09f8f914 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1378,12 +1378,13 @@ JOIN::exec() thd->examined_row_count= 0; DBUG_VOID_RETURN; } - /* - don't reset the found rows count if there're no tables - as FOUND_ROWS() may be called. - */ + /* + Don't reset the found rows count if there're no tables as + FOUND_ROWS() may be called. Never reset the examined row count here. + It must be accumulated from all join iterations of all join parts. + */ if (tables) - thd->limit_found_rows= thd->examined_row_count= 0; + thd->limit_found_rows= 0; if (zero_result_cause) { @@ -1431,6 +1432,12 @@ JOIN::exec() List *curr_all_fields= &all_fields; List *curr_fields_list= &fields_list; TABLE *curr_tmp_table= 0; + /* + Initialize examined rows here because the values from all join parts + must be accumulated in examined_row_count. Hence every join + iteration must count from zero. + */ + curr_join->examined_rows= 0; if ((curr_join->select_lex->options & OPTION_SCHEMA_TABLE) && get_schema_tables_result(curr_join)) @@ -1853,9 +1860,12 @@ JOIN::exec() Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF); error= do_select(curr_join, curr_fields_list, NULL, procedure); thd->limit_found_rows= curr_join->send_records; - thd->examined_row_count= curr_join->examined_rows; } + /* Accumulate the counts from all join iterations of all join parts. */ + thd->examined_row_count+= curr_join->examined_rows; + DBUG_PRINT("counts", ("thd->examined_row_count: %lu", + (ulong) thd->examined_row_count)); DBUG_VOID_RETURN; } @@ -10352,6 +10362,8 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, */ join->examined_rows++; join->thd->row_count++; + DBUG_PRINT("counts", ("join->examined_rows++: %lu", + (ulong) join->examined_rows)); if (found) {