summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2022-01-04 08:20:02 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2022-01-11 09:43:59 +0200
commitc430f612ebf93e0cd2cdcbeaccb3ff06254eb77d (patch)
treecd163135d618d8656e428c8bc3132cefaaca1e72
parentd0ca2415242502181ed18c49d83675f17957ce3a (diff)
downloadmariadb-git-c430f612ebf93e0cd2cdcbeaccb3ff06254eb77d.tar.gz
MDEV-25856 : SIGSEGV in ha_myisammrg::append_create_info
For MERGE-tables we need to init children list before calling show_create_table and then detach children before we continue normal mysql_create_like_table execution.
-rw-r--r--mysql-test/suite/galera/r/galera_create_table_like.result5
-rw-r--r--mysql-test/suite/galera/t/galera_create_table_like.test9
-rw-r--r--sql/wsrep_mysqld.cc25
3 files changed, 26 insertions, 13 deletions
diff --git a/mysql-test/suite/galera/r/galera_create_table_like.result b/mysql-test/suite/galera/r/galera_create_table_like.result
index 131ac311bca..128931381d4 100644
--- a/mysql-test/suite/galera/r/galera_create_table_like.result
+++ b/mysql-test/suite/galera/r/galera_create_table_like.result
@@ -47,3 +47,8 @@ DROP TABLE schema2.real_table2;
DROP TABLE schema2.real_table3;
DROP SCHEMA schema1;
DROP SCHEMA schema2;
+use test;
+CREATE TEMPORARY TABLE t (c INT) ENGINE=mrg_myisam UNION=(t,t2) insert_method=FIRST;
+CREATE TABLE t2 LIKE t;
+ERROR HY000: Table 't' is differently defined or of non-MyISAM type or doesn't exist
+DROP TABLE t;
diff --git a/mysql-test/suite/galera/t/galera_create_table_like.test b/mysql-test/suite/galera/t/galera_create_table_like.test
index 0e0e8b0ffcf..3cf51521be1 100644
--- a/mysql-test/suite/galera/t/galera_create_table_like.test
+++ b/mysql-test/suite/galera/t/galera_create_table_like.test
@@ -48,3 +48,12 @@ DROP TABLE schema2.real_table3;
DROP SCHEMA schema1;
DROP SCHEMA schema2;
+
+#
+# MDEV-25856: SIGSEGV in ha_myisammrg::append_create_info
+#
+use test;
+CREATE TEMPORARY TABLE t (c INT) ENGINE=mrg_myisam UNION=(t,t2) insert_method=FIRST;
+--error 1472
+CREATE TABLE t2 LIKE t;
+DROP TABLE t;
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 4a99f781fdd..b34f6803479 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -2876,7 +2876,7 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table,
if (create_info->tmp_table())
{
/* CREATE TEMPORARY TABLE LIKE must be skipped from replication */
- WSREP_DEBUG("CREATE TEMPORARY TABLE LIKE... skipped replication\n %s",
+ WSREP_DEBUG("CREATE TEMPORARY TABLE LIKE... skipped replication\n %s",
thd->query());
}
else if (!(thd->find_temporary_table(src_table)))
@@ -2886,21 +2886,17 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table,
}
else
{
- /* here we have CREATE TABLE LIKE <temporary table>
- the temporary table definition will be needed in slaves to
- enable the create to succeed
- */
- TABLE_LIST tbl;
- bzero((void*) &tbl, sizeof(tbl));
- tbl.db= src_table->db;
- tbl.table_name= tbl.alias= src_table->table_name;
- tbl.table= src_table->table;
+ /* Non-MERGE tables ignore this call. */
+ if (src_table->table->file->extra(HA_EXTRA_ADD_CHILDREN_LIST))
+ return (true);
+
char buf[2048];
String query(buf, sizeof(buf), system_charset_info);
query.length(0); // Have to zero it since constructor doesn't
- (void) show_create_table(thd, &tbl, &query, NULL, WITH_DB_NAME);
- WSREP_DEBUG("TMP TABLE: %s", query.ptr());
+ int result __attribute__((unused))=
+ show_create_table(thd, src_table, &query, NULL, WITH_DB_NAME);
+ WSREP_DEBUG("TMP TABLE: %s ret_code %d", query.ptr(), result);
thd->wsrep_TOI_pre_query= query.ptr();
thd->wsrep_TOI_pre_query_len= query.length();
@@ -2909,11 +2905,14 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table,
thd->wsrep_TOI_pre_query= NULL;
thd->wsrep_TOI_pre_query_len= 0;
+
+ /* Non-MERGE tables ignore this call. */
+ src_table->table->file->extra(HA_EXTRA_DETACH_CHILDREN);
}
return(false);
-WSREP_ERROR_LABEL:
+wsrep_error_label:
thd->wsrep_TOI_pre_query= NULL;
return (true);
}