Loading mysql-test/r/temp_table.result +17 −0 Original line number Diff line number Diff line Loading @@ -108,3 +108,20 @@ d c bar 2 foo 1 drop table t1, t2; DROP TABLE IF EXISTS t1; CREATE TABLE t1 (i INT); LOCK TABLE t1 WRITE; CREATE TEMPORARY TABLE t1 (i INT); The following command should not block DROP TEMPORARY TABLE t1; DROP TABLE t1; CREATE TABLE t1 (i INT); CREATE TEMPORARY TABLE t2 (i INT); DROP TEMPORARY TABLE t2, t1; ERROR 42S02: Unknown table 't1' SELECT * FROM t2; ERROR 42S02: Table 'test.t2' doesn't exist SELECT * FROM t1; i DROP TABLE t1; End of 4.1 tests. mysql-test/t/temp_table.test +47 −1 Original line number Diff line number Diff line Loading @@ -99,4 +99,50 @@ insert into t2 values (NULL, 'foo'), (NULL, 'bar'); select d, c from t1 left join t2 on b = c where a = 3 order by d; drop table t1, t2; # End of 4.1 tests # # BUG#21096: locking issue ; temporary table conflicts. # # The problem was that on DROP TEMPORARY table name lock was acquired, # which should not be done. # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings CREATE TABLE t1 (i INT); LOCK TABLE t1 WRITE; connect (conn1, localhost, root,,); CREATE TEMPORARY TABLE t1 (i INT); --echo The following command should not block DROP TEMPORARY TABLE t1; disconnect conn1; connection default; DROP TABLE t1; # # Check that it's not possible to drop a base table with # DROP TEMPORARY statement. # CREATE TABLE t1 (i INT); CREATE TEMPORARY TABLE t2 (i INT); --error 1051 DROP TEMPORARY TABLE t2, t1; # Table t2 should have been dropped. --error 1146 SELECT * FROM t2; # But table t1 should still be there. SELECT * FROM t1; DROP TABLE t1; --echo End of 4.1 tests. sql/sql_select.cc +24 −19 Original line number Diff line number Diff line Loading @@ -933,17 +933,28 @@ JOIN::optimize() tmp_table_param.hidden_field_count= (all_fields.elements - fields_list.elements); ORDER *tmp_group= ((!simple_group && !procedure && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list : (ORDER*) 0); /* Pushing LIMIT to the temporary table creation is not applicable when there is ORDER BY or GROUP BY or there is no GROUP BY, but there are aggregate functions, because in all these cases we need all result rows. */ ha_rows tmp_rows_limit= ((order == 0 || skip_sort_order || test(select_options & OPTION_BUFFER_RESULT)) && !tmp_group && !thd->lex->current_select->with_sum_func) ? select_limit : HA_POS_ERROR; if (!(exec_tmp_table1 = create_tmp_table(thd, &tmp_table_param, all_fields, ((!simple_group && !procedure && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list : (ORDER*) 0), tmp_group, group_list ? 0 : select_distinct, group_list && simple_group, select_options, (order == 0 || skip_sort_order || test(select_options & OPTION_BUFFER_RESULT)) ? select_limit : HA_POS_ERROR, tmp_rows_limit, (char *) ""))) DBUG_RETURN(1); Loading Loading @@ -5567,6 +5578,13 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, thd->variables.max_heap_table_size) : thd->variables.tmp_table_size)/ table->reclength); set_if_bigger(table->max_rows,1); // For dummy start options /* Push the LIMIT clause to the temporary table creation, so that we materialize only up to 'rows_limit' records instead of all result records. */ set_if_smaller(table->max_rows, rows_limit); param->end_write_records= rows_limit; keyinfo=param->keyinfo; if (group) Loading Loading @@ -5687,19 +5705,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, } } /* Push the LIMIT clause to the temporary table creation, so that we materialize only up to 'rows_limit' records instead of all result records. This optimization is not applicable when there is GROUP BY or there is no GROUP BY, but there are aggregate functions, because both must be computed for all result rows. */ if (!group && !thd->lex->current_select->with_sum_func) { set_if_smaller(table->max_rows, rows_limit); param->end_write_records= rows_limit; } if (thd->is_fatal_error) // If end of memory goto err; /* purecov: inspected */ table->db_record_offset=1; Loading sql/sql_table.cc +3 −2 Original line number Diff line number Diff line Loading @@ -214,7 +214,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, bool some_tables_deleted=0, tmp_table_deleted=0, foreign_key_error=0; DBUG_ENTER("mysql_rm_table_part2"); if (lock_table_names(thd, tables)) if (!drop_temporary && lock_table_names(thd, tables)) DBUG_RETURN(1); for (table=tables ; table ; table=table->next) Loading Loading @@ -311,6 +311,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, } } if (!drop_temporary) unlock_table_names(thd, tables); DBUG_RETURN(error); } Loading Loading
mysql-test/r/temp_table.result +17 −0 Original line number Diff line number Diff line Loading @@ -108,3 +108,20 @@ d c bar 2 foo 1 drop table t1, t2; DROP TABLE IF EXISTS t1; CREATE TABLE t1 (i INT); LOCK TABLE t1 WRITE; CREATE TEMPORARY TABLE t1 (i INT); The following command should not block DROP TEMPORARY TABLE t1; DROP TABLE t1; CREATE TABLE t1 (i INT); CREATE TEMPORARY TABLE t2 (i INT); DROP TEMPORARY TABLE t2, t1; ERROR 42S02: Unknown table 't1' SELECT * FROM t2; ERROR 42S02: Table 'test.t2' doesn't exist SELECT * FROM t1; i DROP TABLE t1; End of 4.1 tests.
mysql-test/t/temp_table.test +47 −1 Original line number Diff line number Diff line Loading @@ -99,4 +99,50 @@ insert into t2 values (NULL, 'foo'), (NULL, 'bar'); select d, c from t1 left join t2 on b = c where a = 3 order by d; drop table t1, t2; # End of 4.1 tests # # BUG#21096: locking issue ; temporary table conflicts. # # The problem was that on DROP TEMPORARY table name lock was acquired, # which should not be done. # --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings CREATE TABLE t1 (i INT); LOCK TABLE t1 WRITE; connect (conn1, localhost, root,,); CREATE TEMPORARY TABLE t1 (i INT); --echo The following command should not block DROP TEMPORARY TABLE t1; disconnect conn1; connection default; DROP TABLE t1; # # Check that it's not possible to drop a base table with # DROP TEMPORARY statement. # CREATE TABLE t1 (i INT); CREATE TEMPORARY TABLE t2 (i INT); --error 1051 DROP TEMPORARY TABLE t2, t1; # Table t2 should have been dropped. --error 1146 SELECT * FROM t2; # But table t1 should still be there. SELECT * FROM t1; DROP TABLE t1; --echo End of 4.1 tests.
sql/sql_select.cc +24 −19 Original line number Diff line number Diff line Loading @@ -933,17 +933,28 @@ JOIN::optimize() tmp_table_param.hidden_field_count= (all_fields.elements - fields_list.elements); ORDER *tmp_group= ((!simple_group && !procedure && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list : (ORDER*) 0); /* Pushing LIMIT to the temporary table creation is not applicable when there is ORDER BY or GROUP BY or there is no GROUP BY, but there are aggregate functions, because in all these cases we need all result rows. */ ha_rows tmp_rows_limit= ((order == 0 || skip_sort_order || test(select_options & OPTION_BUFFER_RESULT)) && !tmp_group && !thd->lex->current_select->with_sum_func) ? select_limit : HA_POS_ERROR; if (!(exec_tmp_table1 = create_tmp_table(thd, &tmp_table_param, all_fields, ((!simple_group && !procedure && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list : (ORDER*) 0), tmp_group, group_list ? 0 : select_distinct, group_list && simple_group, select_options, (order == 0 || skip_sort_order || test(select_options & OPTION_BUFFER_RESULT)) ? select_limit : HA_POS_ERROR, tmp_rows_limit, (char *) ""))) DBUG_RETURN(1); Loading Loading @@ -5567,6 +5578,13 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, thd->variables.max_heap_table_size) : thd->variables.tmp_table_size)/ table->reclength); set_if_bigger(table->max_rows,1); // For dummy start options /* Push the LIMIT clause to the temporary table creation, so that we materialize only up to 'rows_limit' records instead of all result records. */ set_if_smaller(table->max_rows, rows_limit); param->end_write_records= rows_limit; keyinfo=param->keyinfo; if (group) Loading Loading @@ -5687,19 +5705,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, } } /* Push the LIMIT clause to the temporary table creation, so that we materialize only up to 'rows_limit' records instead of all result records. This optimization is not applicable when there is GROUP BY or there is no GROUP BY, but there are aggregate functions, because both must be computed for all result rows. */ if (!group && !thd->lex->current_select->with_sum_func) { set_if_smaller(table->max_rows, rows_limit); param->end_write_records= rows_limit; } if (thd->is_fatal_error) // If end of memory goto err; /* purecov: inspected */ table->db_record_offset=1; Loading
sql/sql_table.cc +3 −2 Original line number Diff line number Diff line Loading @@ -214,7 +214,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, bool some_tables_deleted=0, tmp_table_deleted=0, foreign_key_error=0; DBUG_ENTER("mysql_rm_table_part2"); if (lock_table_names(thd, tables)) if (!drop_temporary && lock_table_names(thd, tables)) DBUG_RETURN(1); for (table=tables ; table ; table=table->next) Loading Loading @@ -311,6 +311,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, } } if (!drop_temporary) unlock_table_names(thd, tables); DBUG_RETURN(error); } Loading