summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2020-08-25 22:21:07 +0300
committerAleksey Midenkov <midenok@gmail.com>2020-08-25 22:21:07 +0300
commit6586bb51f3167fad9e353e8c9cd69f51e0acec21 (patch)
tree79bc1f700fac38471dca9f503a3c924bb1710ba9
parentc277bcd591821b9956bf0d0c0a71ceb3e230f060 (diff)
downloadmariadb-git-6586bb51f3167fad9e353e8c9cd69f51e0acec21.tar.gz
MDEV-23467 SIGSEGV in fill_record/fill_record_n_invoke_before_triggers on INSERT DELAYED
Field::make_new_field() resets invisible property (needed for "CREATE .. SELECT" f.ex.). Recover invisible property in Delayed_insert::get_local_table() (unireg_check works by the same principle).
-rw-r--r--mysql-test/main/invisible_field.result6
-rw-r--r--mysql-test/main/invisible_field.test8
-rw-r--r--sql/sql_insert.cc1
3 files changed, 15 insertions, 0 deletions
diff --git a/mysql-test/main/invisible_field.result b/mysql-test/main/invisible_field.result
index 053a9fd8e50..ee45567d212 100644
--- a/mysql-test/main/invisible_field.result
+++ b/mysql-test/main/invisible_field.result
@@ -617,3 +617,9 @@ a b
1 3
2 4
drop table t1;
+#
+# MDEV-23467 SIGSEGV in fill_record/fill_record_n_invoke_before_triggers on INSERT DELAYED
+#
+create table t1 (a int, b int invisible);
+insert delayed into t1 values (1);
+drop table t1;
diff --git a/mysql-test/main/invisible_field.test b/mysql-test/main/invisible_field.test
index 0e3994a78ce..7a48347ec29 100644
--- a/mysql-test/main/invisible_field.test
+++ b/mysql-test/main/invisible_field.test
@@ -271,3 +271,11 @@ select a,b from t1;
#cleanup
drop table t1;
+
+--echo #
+--echo # MDEV-23467 SIGSEGV in fill_record/fill_record_n_invoke_before_triggers on INSERT DELAYED
+--echo #
+create table t1 (a int, b int invisible);
+insert delayed into t1 values (1);
+# cleanup
+drop table t1;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index a24cb61449b..b574e7ab9d7 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2614,6 +2614,7 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
if (!(*field= (*org_field)->make_new_field(client_thd->mem_root, copy, 1)))
goto error;
(*field)->unireg_check= (*org_field)->unireg_check;
+ (*field)->invisible= (*org_field)->invisible;
(*field)->orig_table= copy; // Remove connection
(*field)->move_field_offset(adjust_ptrs); // Point at copy->record[0]
memdup_vcol(client_thd, (*field)->vcol_info);