From: Date: July 3 2009 10:35am Subject: bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2792) Bug#45806 List-Archive: http://lists.mysql.com/commits/77865 X-Bug: 45806 Message-Id: <0KM700CPH9AJL4E0@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_G9yipd7e+ZgRt7j8x2fd8Q)" --Boundary_(ID_G9yipd7e+ZgRt7j8x2fd8Q) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/gluh/MySQL/mysql-5.0-bugteam/ based on revid:bernt.johnsen@stripped 2792 Sergey Glukhov 2009-07-03 Bug#45806 crash when replacing into a view with a join! The crash happend because for views which are joins we have table_list->table == 0 and table_list->table->'any method' call leads to crash. The fix is to perform table_list->table->file->extra() method for all tables belonging to view. @ mysql-test/r/view.result test result @ mysql-test/t/view.test test case @ sql/sql_insert.cc added prepare_for_positional_update() function which updates extra info about primary key for tables belonging to view. modified: mysql-test/r/view.result mysql-test/t/view.test sql/sql_insert.cc === modified file 'mysql-test/r/view.result' --- a/mysql-test/r/view.result 2009-05-18 18:43:06 +0000 +++ b/mysql-test/r/view.result 2009-07-03 08:35:00 +0000 @@ -3723,6 +3723,117 @@ DROP TABLE t1; # -- End of test case for Bug#40825 +# +# Bug #45806 crash when replacing into a view with a join! +# +CREATE TABLE t1(a INT UNIQUE); +CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a; +INSERT INTO t1 VALUES (1), (2); +REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c; +SELECT * FROM v1; +a +1 +2 +1 +2 +REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c; +SELECT * FROM v1; +a +1 +2 +3 +1 +2 +3 +1 +2 +3 +DELETE FROM t1 WHERE a=3; +INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c +ON DUPLICATE KEY UPDATE `v1`.`a`= 1; +SELECT * FROM v1; +a +1 +2 +1 +2 +CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a; +REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c; +SELECT * FROM v2; +a +1 +2 +1 +2 +1 +2 +1 +2 +REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c; +SELECT * FROM v2; +a +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c +ON DUPLICATE KEY UPDATE `v2`.`a`= 1; +SELECT * FROM v2; +a +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +1 +2 +3 +DROP VIEW v1; +DROP VIEW v2; +DROP TABLE t1; +# -- End of test case for Bug#45806 # ----------------------------------------------------------------- # -- End of 5.0 tests. # ----------------------------------------------------------------- === modified file 'mysql-test/t/view.test' --- a/mysql-test/t/view.test 2009-05-18 18:43:06 +0000 +++ b/mysql-test/t/view.test 2009-07-03 08:35:00 +0000 @@ -3703,6 +3703,38 @@ DROP TABLE t1; --echo # -- End of test case for Bug#40825 --echo +--echo # +--echo # Bug #45806 crash when replacing into a view with a join! +--echo # +CREATE TABLE t1(a INT UNIQUE); +CREATE VIEW v1 AS SELECT t1.a FROM t1, t1 AS a; +INSERT INTO t1 VALUES (1), (2); + +REPLACE INTO v1(a) SELECT 1 FROM t1,t1 AS c; +SELECT * FROM v1; +REPLACE INTO v1(a) SELECT 3 FROM t1,t1 AS c; +SELECT * FROM v1; +DELETE FROM t1 WHERE a=3; +INSERT INTO v1(a) SELECT 1 FROM t1,t1 AS c +ON DUPLICATE KEY UPDATE `v1`.`a`= 1; +SELECT * FROM v1; + +CREATE VIEW v2 AS SELECT t1.a FROM t1, v1 AS a; + +REPLACE INTO v2(a) SELECT 1 FROM t1,t1 AS c; +SELECT * FROM v2; +REPLACE INTO v2(a) SELECT 3 FROM t1,t1 AS c; +SELECT * FROM v2; +INSERT INTO v2(a) SELECT 1 FROM t1,t1 AS c +ON DUPLICATE KEY UPDATE `v2`.`a`= 1; +SELECT * FROM v2; + +DROP VIEW v1; +DROP VIEW v2; +DROP TABLE t1; + +--echo # -- End of test case for Bug#45806 + --echo # ----------------------------------------------------------------- --echo # -- End of 5.0 tests. --echo # ----------------------------------------------------------------- === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2009-06-17 13:54:01 +0000 +++ b/sql/sql_insert.cc 2009-07-03 08:35:00 +0000 @@ -1149,6 +1149,33 @@ static bool mysql_prepare_insert_check_t /* + Get extra info for tables we insert into + + @param table table(TABLE object) we insert into, + might be NULL in case of view + @param table(TABLE_LIST object) or view we insert into +*/ + +static void prepare_for_positional_update(TABLE *table, TABLE_LIST *tables) +{ + if (table) + { + if(table->reginfo.lock_type != TL_WRITE_DELAYED) + table->file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY); + return; + } + + DBUG_ASSERT(tables->view); + List_iterator it(*tables->view_tables); + TABLE_LIST *tbl; + while ((tbl= it++)) + prepare_for_positional_update(tbl->table, tbl); + + return; +} + + +/* Prepare items in INSERT statement SYNOPSIS @@ -1298,9 +1325,8 @@ bool mysql_prepare_insert(THD *thd, TABL Only call extra() handler method if we are not performing a DELAYED operation. It will instead be executed by delayed insert thread. */ - if ((duplic == DUP_UPDATE || duplic == DUP_REPLACE) && - (table->reginfo.lock_type != TL_WRITE_DELAYED)) - table->file->extra(HA_EXTRA_RETRIEVE_PRIMARY_KEY); + if (duplic == DUP_UPDATE || duplic == DUP_REPLACE) + prepare_for_positional_update(table, table_list); DBUG_RETURN(FALSE); } --Boundary_(ID_G9yipd7e+ZgRt7j8x2fd8Q) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/sergey.glukhov@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/sergey.glukhov@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: sergey.glukhov@stripped # target_branch: file:///home/gluh/MySQL/mysql-5.0-bugteam/ # testament_sha1: 707130225fed2fe4e8cbb5ba0b87df35a0f0d25d # timestamp: 2009-07-03 13:35:09 +0500 # source_branch: bzr+ssh://sgluhov@stripped/bzrroot\ # /server/mysql-5.0-bugteam/ # base_revision_id: bernt.johnsen@stripped\ # o7l4s8syz05rc4w0 # # Begin bundle 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 GS0Ia+A= --Boundary_(ID_G9yipd7e+ZgRt7j8x2fd8Q)--