summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2017-01-08 17:51:36 +0200
committerMonty <monty@mariadb.org>2017-01-08 17:51:36 +0200
commiteed319b6fb543849046c8009c38575455e173dc2 (patch)
tree15665a62a5045b28481bb852bde2095935818424
parenteaf6b053b83d2a46250834e8367477bd3d85d38f (diff)
downloadmariadb-git-eed319b6fb543849046c8009c38575455e173dc2.tar.gz
MDEV-11317: `! is_set()' or `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' fails in Diagnostics_area::set_ok_status on CREATE OR REPLACE with ARCHIVE table
Problem was with deleting non existing .frm file for a storage engine that doesn't have .frm files (yet) Fixed by not giving an error for non existing .frm files for storage engines that are using discovery Fixed also valgrind supression related to the given test case
-rw-r--r--mysql-test/suite/archive/discover.result7
-rw-r--r--mysql-test/suite/archive/discover.test10
-rw-r--r--mysql-test/valgrind.supp15
-rw-r--r--sql/sql_table.cc16
4 files changed, 45 insertions, 3 deletions
diff --git a/mysql-test/suite/archive/discover.result b/mysql-test/suite/archive/discover.result
index e1ca9cb6a65..0619ca2051a 100644
--- a/mysql-test/suite/archive/discover.result
+++ b/mysql-test/suite/archive/discover.result
@@ -139,3 +139,10 @@ flush tables;
create table t1 (a int) engine=archive;
ERROR 42S01: Table 't1' already exists
drop table t1;
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+SELECT * FROM t1;
+pk
+DROP TABLE t1;
diff --git a/mysql-test/suite/archive/discover.test b/mysql-test/suite/archive/discover.test
index 20cb69efa00..4ab35cf1115 100644
--- a/mysql-test/suite/archive/discover.test
+++ b/mysql-test/suite/archive/discover.test
@@ -132,3 +132,13 @@ flush tables;
create table t1 (a int) engine=archive;
drop table t1;
+#
+# MDEV-11317: Error in deleting non existing .frm for tables with disocvery
+#
+
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+DROP TABLE t1;
+CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
+SELECT * FROM t1;
+DROP TABLE t1;
diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp
index 77f17cf07ec..a7d7f2ee67a 100644
--- a/mysql-test/valgrind.supp
+++ b/mysql-test/valgrind.supp
@@ -353,10 +353,23 @@
Memcheck:Leak
fun:memalign
...
- fun:call_init
+ fun:call_init*
+ fun:_dl_init
+}
+
+# This one is on OpenSuse 10.3 with gcc 5.4
+{
+ memory "loss" from _dl_init 2
+ Memcheck:Leak
+ fun:malloc
+ fun:pool
+ ...
+ fun:call_init*
fun:_dl_init
}
+
+
#
# dlclose can allocate memory for error message, the memory will be
# freed by dlerror or other dl* function.
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 62dff1b5928..8569771d5f1 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2497,7 +2497,19 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
int frm_delete_error, trigger_drop_error= 0;
/* Delete the table definition file */
strmov(end,reg_ext);
- frm_delete_error= mysql_file_delete(key_file_frm, path, MYF(MY_WME));
+ if (table_type && table_type != view_pseudo_hton &&
+ table_type->discover_table)
+ {
+ /*
+ Table type is using discovery and may not need a .frm file.
+ Delete it silently if it exists
+ */
+ (void) mysql_file_delete(key_file_frm, path, MYF(0));
+ frm_delete_error= 0;
+ }
+ else
+ frm_delete_error= mysql_file_delete(key_file_frm, path,
+ MYF(MY_WME));
if (frm_delete_error)
frm_delete_error= my_errno;
else
@@ -2513,7 +2525,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
else if (frm_delete_error && if_exists)
thd->clear_error();
}
- non_tmp_error= error ? TRUE : non_tmp_error;
+ non_tmp_error|= MY_TEST(error);
}
if (error)
{