Commit b22285e4 authored by Igor Babaev's avatar Igor Babaev

MDEV-16940 Server crashes in unsafe_key_update upon attempt to update view

           through 2nd execution of SP

This bug caused a server crash on the second call of any stored procedure
that contained an UPDATE statement over a multi-table view reporting an
error message at the prepare stage.
On the first call of the stored procedure after reporting an error at
the preparation stage of the UPDATE statement finished without calling
the function SELECT_LEX::save_prep_leaf_tables() for the SELECT used as
the definition of the view. This left the SELECT_LEX structure used by
the UPDATE statement in an inconsistent state for second call of the stored
procedure.

Approved by Oleksandr Byelkin <sanja@mariadb.com>
parent 3caccc7b
...@@ -6802,5 +6802,21 @@ drop database db1; ...@@ -6802,5 +6802,21 @@ drop database db1;
create database test; create database test;
use test; use test;
# #
# MDEV-16940: update of multi-table view returning error used in SP
#
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1), (2);
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
INSERT INTO t2 VALUES (2), (3);
CREATE VIEW v1 AS SELECT a, b FROM t1,t2;
CREATE PROCEDURE sp1() UPDATE v1 SET a = 8, b = 9;
CALL sp1;
ERROR HY000: Can not modify more than one base table through a join view 'test.v1'
CALL sp1;
ERROR HY000: Can not modify more than one base table through a join view 'test.v1'
DROP PROCEDURE sp1;
DROP VIEW v1;
DROP TABLE t1, t2;
#
# End of 10.2 tests # End of 10.2 tests
# #
...@@ -6521,6 +6521,28 @@ drop database db1; ...@@ -6521,6 +6521,28 @@ drop database db1;
create database test; create database test;
use test; use test;
--echo #
--echo # MDEV-16940: update of multi-table view returning error used in SP
--echo #
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1), (2);
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
INSERT INTO t2 VALUES (2), (3);
CREATE VIEW v1 AS SELECT a, b FROM t1,t2;
CREATE PROCEDURE sp1() UPDATE v1 SET a = 8, b = 9;
--error ER_VIEW_MULTIUPDATE
CALL sp1;
--error ER_VIEW_MULTIUPDATE
CALL sp1;
DROP PROCEDURE sp1;
DROP VIEW v1;
DROP TABLE t1, t2;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
...@@ -4585,6 +4585,9 @@ bool LEX::save_prep_leaf_tables() ...@@ -4585,6 +4585,9 @@ bool LEX::save_prep_leaf_tables()
bool st_select_lex::save_prep_leaf_tables(THD *thd) bool st_select_lex::save_prep_leaf_tables(THD *thd)
{ {
if (prep_leaf_list_state == SAVED)
return FALSE;
List_iterator_fast<TABLE_LIST> li(leaf_tables); List_iterator_fast<TABLE_LIST> li(leaf_tables);
TABLE_LIST *table; TABLE_LIST *table;
......
...@@ -1398,6 +1398,9 @@ bool Multiupdate_prelocking_strategy::handle_end(THD *thd) ...@@ -1398,6 +1398,9 @@ bool Multiupdate_prelocking_strategy::handle_end(THD *thd)
if (select_lex->handle_derived(thd->lex, DT_MERGE)) if (select_lex->handle_derived(thd->lex, DT_MERGE))
DBUG_RETURN(1); DBUG_RETURN(1);
if (thd->lex->save_prep_leaf_tables())
DBUG_RETURN(1);
List<Item> *fields= &lex->select_lex.item_list; List<Item> *fields= &lex->select_lex.item_list;
if (setup_fields_with_no_wrap(thd, Ref_ptr_array(), if (setup_fields_with_no_wrap(thd, Ref_ptr_array(),
*fields, MARK_COLUMNS_WRITE, 0, 0)) *fields, MARK_COLUMNS_WRITE, 0, 0))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment