From: Sergey Glukhov Date: July 3 2009 7:37am Subject: bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2789) Bug#45806 List-Archive: http://lists.mysql.com/commits/77858 X-Bug: 45806 Message-Id: <0KM7003T76MB9UG0@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_L0+2nh/eLJyW3TLH4RmMHw)" --Boundary_(ID_L0+2nh/eLJyW3TLH4RmMHw) 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-bug-45806/ based on revid:staale.smedseng@stripped 2789 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 07:37:16 +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 07:37:16 +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 07:37:16 +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_L0+2nh/eLJyW3TLH4RmMHw) 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-bug-45806/ # testament_sha1: 845939d4c73a0dac9d2ec8b17c06dfe3b798bd3f # timestamp: 2009-07-03 12:37:24 +0500 # base_revision_id: staale.smedseng@stripped\ # hdxl4s2qc6blisig # # Begin bundle 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 OUyqFg== --Boundary_(ID_L0+2nh/eLJyW3TLH4RmMHw)--