diff options
-rw-r--r-- | mysql-test/r/csv.result | 24 | ||||
-rw-r--r-- | mysql-test/t/csv.test | 32 | ||||
-rw-r--r-- | sql/examples/ha_tina.cc | 15 | ||||
-rw-r--r-- | sql/examples/ha_tina.h | 1 |
4 files changed, 69 insertions, 3 deletions
diff --git a/mysql-test/r/csv.result b/mysql-test/r/csv.result index 2e3d11ad461..3c87c1f4b92 100644 --- a/mysql-test/r/csv.result +++ b/mysql-test/r/csv.result @@ -4976,3 +4976,27 @@ c1 4 5 DROP TABLE bug14672; +create table t1 (a int) engine=csv; +insert t1 values (1); +delete from t1; +affected rows: 1 +delete from t1; +affected rows: 0 +insert t1 values (1),(2); +delete from t1; +affected rows: 2 +insert t1 values (1),(2),(3); +flush tables; +delete from t1; +affected rows: 3 +insert t1 values (1),(2),(3),(4); +flush tables; +select count(*) from t1; +count(*) +4 +delete from t1; +affected rows: 4 +insert t1 values (1),(2),(3),(4),(5); +truncate table t1; +affected rows: 0 +drop table t1; diff --git a/mysql-test/t/csv.test b/mysql-test/t/csv.test index 5b693335a43..a028f6ced6d 100644 --- a/mysql-test/t/csv.test +++ b/mysql-test/t/csv.test @@ -1352,3 +1352,35 @@ SELECT * FROM bug14672; DROP TABLE bug14672; # End of 4.1 tests + +# +# BUG#13406 - incorrect amount of "records deleted" +# + +create table t1 (a int) engine=csv; +insert t1 values (1); +--enable_info +delete from t1; -- delete_row +delete from t1; -- delete_all_rows +--disable_info +insert t1 values (1),(2); +--enable_info +delete from t1; -- delete_all_rows +--disable_info +insert t1 values (1),(2),(3); +flush tables; +--enable_info +delete from t1; -- delete_row +--disable_info +insert t1 values (1),(2),(3),(4); +flush tables; +select count(*) from t1; +--enable_info +delete from t1; -- delete_all_rows +--disable_info +insert t1 values (1),(2),(3),(4),(5); +--enable_info +truncate table t1; -- truncate +--disable_info +drop table t1; + diff --git a/sql/examples/ha_tina.cc b/sql/examples/ha_tina.cc index e00657c66ba..8ae82f97d0b 100644 --- a/sql/examples/ha_tina.cc +++ b/sql/examples/ha_tina.cc @@ -274,7 +274,8 @@ ha_tina::ha_tina(TABLE *table_arg) These definitions are found in hanler.h These are not probably completely right. */ - current_position(0), next_position(0), chain_alloced(0), chain_size(DEFAULT_CHAIN_LENGTH) + current_position(0), next_position(0), chain_alloced(0), + chain_size(DEFAULT_CHAIN_LENGTH), records_is_known(0) { /* Set our original buffers from pre-allocated memory */ buffer.set(byte_buffer, IO_SIZE, system_charset_info); @@ -504,6 +505,7 @@ int ha_tina::write_row(byte * buf) */ if (get_mmap(share, 0) > 0) DBUG_RETURN(-1); + records++; DBUG_RETURN(0); } @@ -668,6 +670,7 @@ int ha_tina::rnd_init(bool scan) current_position= next_position= 0; records= 0; + records_is_known= 0; chain_ptr= chain; #ifdef HAVE_MADVISE if (scan) @@ -745,7 +748,7 @@ void ha_tina::info(uint flag) { DBUG_ENTER("ha_tina::info"); /* This is a lie, but you don't want the optimizer to see zero or 1 */ - if (records < 2) + if (!records_is_known && records < 2) records= 2; DBUG_VOID_RETURN; } @@ -780,6 +783,8 @@ int ha_tina::rnd_end() { DBUG_ENTER("ha_tina::rnd_end"); + records_is_known= 1; + /* First position will be truncate position, second will be increment */ if ((chain_ptr - chain) > 0) { @@ -824,17 +829,21 @@ int ha_tina::rnd_end() } /* - Truncate table and others of its ilk call this. + DELETE without WHERE calls it */ int ha_tina::delete_all_rows() { DBUG_ENTER("ha_tina::delete_all_rows"); + if (!records_is_known) + return (my_errno=HA_ERR_WRONG_COMMAND); + int rc= my_chsize(share->data_file, 0, 0, MYF(MY_WME)); if (get_mmap(share, 0) > 0) DBUG_RETURN(-1); + records=0; DBUG_RETURN(rc); } diff --git a/sql/examples/ha_tina.h b/sql/examples/ha_tina.h index 84854e868fa..97659f99dd9 100644 --- a/sql/examples/ha_tina.h +++ b/sql/examples/ha_tina.h @@ -48,6 +48,7 @@ class ha_tina: public handler tina_set *chain_ptr; byte chain_alloced; uint32 chain_size; + bool records_is_known; public: ha_tina(TABLE *table_arg); |