Loading mysql-test/r/sp.result +11 −0 Original line number Diff line number Diff line Loading @@ -4811,6 +4811,17 @@ begin declare x int; select id from t1 order by x; end| drop procedure if exists bug14945| create table t3 (id int not null auto_increment primary key)| create procedure bug14945() deterministic truncate t3| insert into t3 values (null)| call bug14945()| insert into t3 values (null)| select * from t3| id 1 drop table t3| drop procedure bug14945| create procedure bug16474_2(x int) select id from t1 order by x| call bug16474_1()| Loading mysql-test/t/sp.test +15 −0 Original line number Diff line number Diff line Loading @@ -5666,6 +5666,21 @@ begin select id from t1 order by x; end| # # BUG#14945: Truncate table doesn't reset the auto_increment counter # --disable_warnings drop procedure if exists bug14945| --enable_warnings create table t3 (id int not null auto_increment primary key)| create procedure bug14945() deterministic truncate t3| insert into t3 values (null)| call bug14945()| insert into t3 values (null)| select * from t3| drop table t3| drop procedure bug14945| # This does NOT order by column index; variable is an expression. create procedure bug16474_2(x int) select id from t1 order by x| Loading sql/opt_sum.cc +7 −20 Original line number Diff line number Diff line Loading @@ -123,8 +123,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) If the storage manager of 'tl' gives exact row count, compute the total number of rows. If there are no outer table dependencies, this count may be used as the real count. Schema tables are filled after this function is invoked, so we can't get row count */ if (tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) if ((tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) || tl->schema_table) { is_exact_count= FALSE; count= 1; // ensure count != 0 Loading @@ -149,32 +152,16 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) switch (item_sum->sum_func()) { case Item_sum::COUNT_FUNC: /* If the expr in count(expr) can never be null we can change this If the expr in COUNT(expr) can never be null we can change this to the number of rows in the tables if this number is exact and there are no outer joins. */ if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null && !outer_tables && is_exact_count) { longlong count= 1; TABLE_LIST *table; for (table= tables; table; table= table->next_leaf) { if (outer_tables || (table->table->file->table_flags() & HA_NOT_EXACT_COUNT) || table->schema_table) { const_result= 0; // Can't optimize left join break; } tables->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK); count*= table->table->file->records; } if (!table) { ((Item_sum_count*) item)->make_const(count); recalc_const_item= 1; } } else const_result= 0; break; Loading sql/sql_delete.cc +1 −2 Original line number Diff line number Diff line Loading @@ -842,8 +842,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) table_list->db, table_list->table_name); DBUG_RETURN(TRUE); } if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE) || thd->lex->sphead) if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE)) goto trunc_by_del; if (lock_and_wait_for_table_name(thd, table_list)) DBUG_RETURN(TRUE); Loading sql/sql_parse.cc +1 −1 Original line number Diff line number Diff line Loading @@ -3350,7 +3350,7 @@ mysql_execute_command(THD *thd) Don't allow this within a transaction because we want to use re-generate table */ if ((thd->locked_tables && !lex->sphead) || thd->active_transaction()) if (thd->locked_tables || thd->active_transaction()) { my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0)); Loading Loading
mysql-test/r/sp.result +11 −0 Original line number Diff line number Diff line Loading @@ -4811,6 +4811,17 @@ begin declare x int; select id from t1 order by x; end| drop procedure if exists bug14945| create table t3 (id int not null auto_increment primary key)| create procedure bug14945() deterministic truncate t3| insert into t3 values (null)| call bug14945()| insert into t3 values (null)| select * from t3| id 1 drop table t3| drop procedure bug14945| create procedure bug16474_2(x int) select id from t1 order by x| call bug16474_1()| Loading
mysql-test/t/sp.test +15 −0 Original line number Diff line number Diff line Loading @@ -5666,6 +5666,21 @@ begin select id from t1 order by x; end| # # BUG#14945: Truncate table doesn't reset the auto_increment counter # --disable_warnings drop procedure if exists bug14945| --enable_warnings create table t3 (id int not null auto_increment primary key)| create procedure bug14945() deterministic truncate t3| insert into t3 values (null)| call bug14945()| insert into t3 values (null)| select * from t3| drop table t3| drop procedure bug14945| # This does NOT order by column index; variable is an expression. create procedure bug16474_2(x int) select id from t1 order by x| Loading
sql/opt_sum.cc +7 −20 Original line number Diff line number Diff line Loading @@ -123,8 +123,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) If the storage manager of 'tl' gives exact row count, compute the total number of rows. If there are no outer table dependencies, this count may be used as the real count. Schema tables are filled after this function is invoked, so we can't get row count */ if (tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) if ((tl->table->file->table_flags() & HA_NOT_EXACT_COUNT) || tl->schema_table) { is_exact_count= FALSE; count= 1; // ensure count != 0 Loading @@ -149,32 +152,16 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds) switch (item_sum->sum_func()) { case Item_sum::COUNT_FUNC: /* If the expr in count(expr) can never be null we can change this If the expr in COUNT(expr) can never be null we can change this to the number of rows in the tables if this number is exact and there are no outer joins. */ if (!conds && !((Item_sum_count*) item)->args[0]->maybe_null && !outer_tables && is_exact_count) { longlong count= 1; TABLE_LIST *table; for (table= tables; table; table= table->next_leaf) { if (outer_tables || (table->table->file->table_flags() & HA_NOT_EXACT_COUNT) || table->schema_table) { const_result= 0; // Can't optimize left join break; } tables->table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK); count*= table->table->file->records; } if (!table) { ((Item_sum_count*) item)->make_const(count); recalc_const_item= 1; } } else const_result= 0; break; Loading
sql/sql_delete.cc +1 −2 Original line number Diff line number Diff line Loading @@ -842,8 +842,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) table_list->db, table_list->table_name); DBUG_RETURN(TRUE); } if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE) || thd->lex->sphead) if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE)) goto trunc_by_del; if (lock_and_wait_for_table_name(thd, table_list)) DBUG_RETURN(TRUE); Loading
sql/sql_parse.cc +1 −1 Original line number Diff line number Diff line Loading @@ -3350,7 +3350,7 @@ mysql_execute_command(THD *thd) Don't allow this within a transaction because we want to use re-generate table */ if ((thd->locked_tables && !lex->sphead) || thd->active_transaction()) if (thd->locked_tables || thd->active_transaction()) { my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0)); Loading