summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc24
1 files changed, 18 insertions, 6 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index e63916ebb49..e84462a3a2d 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1182,12 +1182,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)
{
@@ -1235,6 +1236,12 @@ JOIN::exec()
List<Item> *curr_all_fields= &all_fields;
List<Item> *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;
/* Create a tmp table if distinct or if the sort is too complicated */
if (need_tmp)
@@ -1583,7 +1590,10 @@ JOIN::exec()
error= thd->net.report_error ? -1 :
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;
}
@@ -6184,6 +6194,8 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
return -2; /* purecov: inspected */
}
join->examined_rows++;
+ DBUG_PRINT("counts", ("join->examined_rows++: %lu",
+ (ulong) join->examined_rows));
join->thd->row_count++;
if (!on_expr || on_expr->val_int())
{