Fix rare infinite loop in make_join_statistics(). Thanks to

Paul Cadach <paul@odt.east.telecom.kz> for the code.

See Message-ID: <000a01c0a022$c0b910a0$b78313d4@private3se6v3w>
on internals@lists.mysql.com.
parent fd45aed7
...@@ -945,8 +945,10 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, ...@@ -945,8 +945,10 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
DBUG_RETURN(1); DBUG_RETURN(1);
/* loop until no more const tables are found */ /* loop until no more const tables are found */
int ref_changed;
do do
{ {
ref_changed = 0;
found_ref=0; found_ref=0;
for (JOIN_TAB **pos=stat_vector+const_count; (s= *pos) ; pos++) for (JOIN_TAB **pos=stat_vector+const_count; (s= *pos) ; pos++)
{ {
...@@ -996,6 +998,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, ...@@ -996,6 +998,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
s->type=JT_CONST; s->type=JT_CONST;
const_table_map|=table->map; const_table_map|=table->map;
set_position(join,const_count++,s,start_keyuse); set_position(join,const_count++,s,start_keyuse);
ref_changed = 1;
break; break;
} }
else else
...@@ -1004,7 +1007,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds, ...@@ -1004,7 +1007,7 @@ make_join_statistics(JOIN *join,TABLE_LIST *tables,COND *conds,
} }
} }
} }
} while (const_table_map & found_ref); } while (const_table_map & found_ref && ref_changed);
/* Calc how many (possible) matched records in each table */ /* Calc how many (possible) matched records in each table */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment