summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2019-07-11 14:50:50 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2019-07-18 10:01:53 +0200
commitcc86a0bd11a436dfe4df0622481c571f83b1680a (patch)
tree6678675e05db8d4c0587e21521f7d655ca33ae51
parent1a79a29c87eca4dffa393796b7dc4deb62eb0865 (diff)
downloadmariadb-git-cc86a0bd11a436dfe4df0622481c571f83b1680a.tar.gz
MDEV-15572: view.test, server crash with --big-tables=1
Check that table is really opened before cleanup using handler.
-rw-r--r--mysql-test/r/view.result15
-rw-r--r--mysql-test/t/view.test20
-rw-r--r--sql/sql_insert.cc6
3 files changed, 40 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 7fc3c48c3a0..98692a0b8ee 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -5732,6 +5732,21 @@ t37, t38, t39, t40, t41, t42, t43, t44, t45,
t46, t47, t48, t49, t50, t51, t52, t53, t54,
t55, t56, t57, t58, t59,t60;
drop view v60;
+#
+# MDEV-15572: view.test, server crash with --big-tables=1
+#
+set @save_big_tables=@@big_tables;
+set big_tables=ON;
+CREATE TABLE t1 ( f1 int , f2 int , f3 int , f4 int);
+CREATE TABLE t2 ( f1 int , f2 int , f3 int , f4 int);
+CREATE VIEW v1 AS
+SELECT t2.f1, t1.f2, t2.f3, t2.f4 FROM (t1 JOIN t2);
+REPLACE INTO v1 (f1, f2, f3, f4)
+SELECT f1, f2, f3, f4 FROM t1;
+ERROR HY000: Can not modify more than one base table through a join view 'test.v1'
+drop view v1;
+drop table t1, t2;
+set big_tables=@save_big_tables;
# -----------------------------------------------------------------
# -- End of 5.5 tests.
# -----------------------------------------------------------------
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index 835f12957d4..0c4680eb5d2 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -5674,6 +5674,26 @@ t46, t47, t48, t49, t50, t51, t52, t53, t54,
t55, t56, t57, t58, t59,t60;
drop view v60;
+--echo #
+--echo # MDEV-15572: view.test, server crash with --big-tables=1
+--echo #
+
+set @save_big_tables=@@big_tables;
+set big_tables=ON;
+CREATE TABLE t1 ( f1 int , f2 int , f3 int , f4 int);
+CREATE TABLE t2 ( f1 int , f2 int , f3 int , f4 int);
+
+CREATE VIEW v1 AS
+ SELECT t2.f1, t1.f2, t2.f3, t2.f4 FROM (t1 JOIN t2);
+
+--error ER_VIEW_MULTIUPDATE
+REPLACE INTO v1 (f1, f2, f3, f4)
+ SELECT f1, f2, f3, f4 FROM t1;
+
+drop view v1;
+drop table t1, t2;
+set big_tables=@save_big_tables;
+
--echo # -----------------------------------------------------------------
--echo # -- End of 5.5 tests.
--echo # -----------------------------------------------------------------
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 8f5ef0b531c..ddf9bd155a9 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -3743,8 +3743,12 @@ void select_insert::abort_result_set() {
example), no table will have been opened and therefore 'table'
will be NULL. In that case, we still need to execute the rollback
and the end of the function.
+
+ If it fail due to inability to insert in multi-table view for example,
+ table will be assigned with view table structure, but that table will
+ not be opened really (it is dummy to check fields types & Co).
*/
- if (table)
+ if (table && table->file->get_table())
{
bool changed, transactional_table;
/*