From e86715ab498ce98abf015dc61badd242bf9e6c18 Mon Sep 17 00:00:00 2001 From: MySQL Build Team <build@mysql.com> Date: Wed, 25 Nov 2009 18:16:26 +0100 Subject: [PATCH] Backport into build-200911241145-5.1.40sp1 > ------------------------------------------------------------ > revno: 3184.3.13 > revision-id: joro@sun.com-20091019135504-e6fmhf4xyy0wdymb > parent: joro@sun.com-20091026095557-euhe1z9oxtgkw35h > committer: Georgi Kodinov <joro@sun.com> > branch nick: B47788-5.1-bugteam > timestamp: Mon 2009-10-19 16:55:04 +0300 > message: > Bug #47788: Crash in TABLE_LIST::hide_view_error on > UPDATE + VIEW + SP + MERGE + ALTER > > When cleaning up the stored procedure's internal > structures the flag to ignore the errors for > INSERT/UPDATE IGNORE was not cleaned up. > As a result error ignoring was on during name > resolution. And this is an abnormal situation : the > SELECT_LEX flag can be on only during query execution. > > Fixed by correctly cleaning up the SELECT_LEX flag > when reusing the SELECT_LEX in a second execution. --- mysql-test/r/sp-error.result | 16 ++++++++++++++++ mysql-test/t/sp-error.test | 24 ++++++++++++++++++++++++ sql/sql_prepare.cc | 3 +++ 3 files changed, 43 insertions(+) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index 17ab2b79043..b3968ea7eb6 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -1670,3 +1670,19 @@ NULL SELECT non_existent (a) FROM t1 WHERE b = 999999; ERROR 42000: FUNCTION test.non_existent does not exist DROP TABLE t1; +# +# Bug #47788: Crash in TABLE_LIST::hide_view_error on UPDATE + VIEW + +# SP + MERGE + ALTER +# +CREATE TABLE t1 (pk INT, b INT, KEY (b)); +CREATE ALGORITHM = TEMPTABLE VIEW v1 AS SELECT * FROM t1; +CREATE PROCEDURE p1 (a int) UPDATE IGNORE v1 SET b = a; +CALL p1(5); +ERROR HY000: The target table v1 of the UPDATE is not updatable +ALTER TABLE t1 CHANGE COLUMN b b2 INT; +CALL p1(7); +ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +DROP PROCEDURE p1; +DROP VIEW v1; +DROP TABLE t1; +End of 5.1 tests diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 66b960c938f..18a4a117939 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -2448,3 +2448,27 @@ SELECT AVG (a) FROM t1 WHERE b = 999999; --error ER_SP_DOES_NOT_EXIST SELECT non_existent (a) FROM t1 WHERE b = 999999; DROP TABLE t1; + +--echo # +--echo # Bug #47788: Crash in TABLE_LIST::hide_view_error on UPDATE + VIEW + +--echo # SP + MERGE + ALTER +--echo # + +CREATE TABLE t1 (pk INT, b INT, KEY (b)); +CREATE ALGORITHM = TEMPTABLE VIEW v1 AS SELECT * FROM t1; + +CREATE PROCEDURE p1 (a int) UPDATE IGNORE v1 SET b = a; + +--error ER_NON_UPDATABLE_TABLE +CALL p1(5); + +ALTER TABLE t1 CHANGE COLUMN b b2 INT; + +--error ER_VIEW_INVALID +CALL p1(7); + +DROP PROCEDURE p1; +DROP VIEW v1; +DROP TABLE t1; + +--echo End of 5.1 tests diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index c1839b7220f..7c618ac4b37 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2342,6 +2342,9 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) /* Fix ORDER list */ for (order= (ORDER *)sl->order_list.first; order; order= order->next) order->item= &order->item_ptr; + + /* clear the no_error flag for INSERT/UPDATE IGNORE */ + sl->no_error= FALSE; } { SELECT_LEX_UNIT *unit= sl->master_unit(); -- 2.30.9