summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/csv.result24
-rw-r--r--mysql-test/t/csv.test32
-rw-r--r--sql/examples/ha_tina.cc15
-rw-r--r--sql/examples/ha_tina.h1
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);