From: kevin.lewis Date: July 7 2011 9:29pm Subject: bzr commit into mysql-5.1 branch (kevin.lewis:3568) Bug#12637786 List-Archive: http://lists.mysql.com/commits/140251 X-Bug: 12637786 Message-Id: <20110707212942.C41EF13C25C3@kevin-lewis-macbook.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0591645326==" --===============0591645326== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/kevinlewis/Work/Mysql/12637786/mysql-5.1/ based on revid:joerg.bruehe@stripped 3568 kevin.lewis@stripped 2011-07-07 Bug#12637786 was fixed with rb:692 by marko. But that fix has a remaining bug. It added this assert; ut_ad(ind_field->prefix_len); before a section of code that assumes there is a prefix_len. The patch replaced code that explicitly avoided this with a check for prefix_len. It turns out that the purge thread can get to that assert without a prefix_len because it does not use a row_ext_t* . When UNIV_DEBUG is not defined, the affect of this is that the purge thread sets the dfield->len to zero and then cannot find the entry in the index to purge. So secondary index entries remain unpurged. This patch does not do the assert. Instead, it uses 'if (ind_field->prefix_len) {...}' around the section of code that assumes a prefix_len. This is the way the patch I provided to Marko did it. The test case is simply modified to do a sleep(10) in order to give the purge thread a chance to run. Without the code change to row0row.c, this modified testcase will assert if InnoDB was compiled with UNIV_DEBUG. I tried to sleep(5), but it did not always assert. modified: mysql-test/suite/innodb_plugin/r/innodb-index.result mysql-test/suite/innodb_plugin/t/innodb-index.test storage/innodb_plugin/row/row0row.c === modified file 'mysql-test/suite/innodb_plugin/r/innodb-index.result' --- a/mysql-test/suite/innodb_plugin/r/innodb-index.result revid:joerg.bruehe@stripped +++ b/mysql-test/suite/innodb_plugin/r/innodb-index.result revid:kevin.lewis@stripped @@ -1022,6 +1022,7 @@ v16 VARCHAR(500), v17 VARCHAR(500), v18 CREATE INDEX idx1 ON t1(a,v1); INSERT INTO t1 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r); UPDATE t1 SET a=1000; +DELETE FROM t1; DROP TABLE t1; set global innodb_file_per_table=0; set global innodb_file_format=Antelope; === modified file 'mysql-test/suite/innodb_plugin/t/innodb-index.test' --- a/mysql-test/suite/innodb_plugin/t/innodb-index.test revid:joerg.bruehe@stripped +++ b/mysql-test/suite/innodb_plugin/t/innodb-index.test revid:kevin.lewis@stripped @@ -475,6 +475,9 @@ CREATE TABLE t1(a INT, CREATE INDEX idx1 ON t1(a,v1); INSERT INTO t1 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r); UPDATE t1 SET a=1000; +DELETE FROM t1; +# Let the purge thread clean up this file. +-- sleep 10 DROP TABLE t1; eval set global innodb_file_per_table=$per_table; === modified file 'storage/innodb_plugin/row/row0row.c' --- a/storage/innodb_plugin/row/row0row.c revid:joerg.bruehe@stripped +++ b/storage/innodb_plugin/row/row0row.c revid:kevin.lewis@stripped @@ -148,22 +148,27 @@ row_build_index_entry( continue; } } else if (dfield_is_ext(dfield)) { - /* This table should be in Antelope format - (ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPACT). - In that format, the maximum column prefix + /* This table is either in Antelope format + (ROW_FORMAT=REDUNDANT or ROW_FORMAT=COMPACT) + or a purge record where the ordered part of + the field is not external. + In Antelope, the maximum column prefix index length is 767 bytes, and the clustered index record contains a 768-byte prefix of each off-page column. */ ut_a(len >= BTR_EXTERN_FIELD_REF_SIZE); len -= BTR_EXTERN_FIELD_REF_SIZE; + dfield_set_len(dfield, len); } /* If a column prefix index, take only the prefix. */ - ut_ad(ind_field->prefix_len); - len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminlen, col->mbmaxlen, - ind_field->prefix_len, len, dfield_get_data(dfield)); - dfield_set_len(dfield, len); + if (ind_field->prefix_len) { + len = dtype_get_at_most_n_mbchars( + col->prtype, col->mbminlen, col->mbmaxlen, + ind_field->prefix_len, len, + dfield_get_data(dfield)); + dfield_set_len(dfield, len); + } } ut_ad(dtuple_check_typed(entry)); --===============0591645326== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/kevin.lewis@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kevin.lewis@stripped # target_branch: file:///Users/kevinlewis/Work/Mysql/12637786/mysql-\ # 5.1/ # testament_sha1: b09f365d3a49b7d62da2b6f2b7ab5aee8727379c # timestamp: 2011-07-07 16:29:41 -0500 # base_revision_id: joerg.bruehe@stripped\ # x5rlprp7q3c6v4g2 # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWWAcrDEAA7dfgEAwWvf//3+n 34C////6YAh9rX3riFU72i6Ubs7m3Ns3Y1TWO6EkiZFPRqMNSfiNKb1MRqeSeUZqMTIZAAaBJJMi eQ0ymQpkyZGmEAAA0AAAISenqp6gAABoAAAAAAAAEiRNNTTI1Mp+lPJpGak/JT9KPUNAGjI0D1NM npDhppkYjCaYCGATTCMExMhpkaGgEkQECaNNCGk02mpqP0gmammmm1GgaBkyJQm0EkhobTYiuc8M tO/X44/n02YWnlru7KfB/GRvb6/QqdMOP8xJ4hpXk07EGt303FH4PEEg2bSx2GUsmhl7f9eVP3y6 UamZiBbzycfQtyxTbbQ2f5/Qs87fdBlJypbY2GqueUhBswxZCLSyRoVO8+1L1rsyvKppa8jqrSZ9 RdOHD90pkjxu5688rPCrnHQRacrraXw3of2Wd1Jjkycf4wbHRZSl+rlQsXhJ7ij4xZTg3aozCd43 wekbqGxFiIexSHDUERhFBRRBoY2l7iWHbCMIb4KfpACwzCU5KMmaL8tzzDNzVAetmp3GPDrnNmvb Dacu7jaeUY1nlJyKj9NckPZBt3cAVhnU5iDq63QOvlsNhW3N00wIerI9YO1w9s0U5nZNXm0JQ/vT mLQBktu9KLhga5YsaXFimF6YCNkwT6E6W9j22X+eOh8WOz18NrRWkJUBWol5xV4blgpa6rdy0TQc zIPVIj5REfunJdprqIOxKIHRbImX0LFYlQuqWAEkKx6Eb6G8ZElSdxMoVU7OxLMRtC7TJkr7XoWp /V+F5Xw8hMPTiAZ8Dh5LQCcIwS9mW0RDLa3bdjSSO7WzYI0+bRQH5a05U0uH+9KL7TPlfvmNJhTk pioYqOPJeuKDDad3Fdcc/EUwzEGfRQnQRMqtSZbJmBkSVR3WsrbWZiQRfSvSvFRmbvQHGWXGoys4 6P4rKzHWzxGF4Y3jmiijuchoSzN269LM+am5uMN9CIzK9OYI6obYBlaQIzNM9/U4ZtYSWBUhlJ2z uBwgaDCR5koINEHir5YKLadtbrqsiw2LlJWJxqN+w1lmJxU08cs4SS0hippQ6FnTfaJSdNUHjnvi nmV6rcYpb+y/qT670RKJXmdFYt2UidADQ7rKDiM0ne4k546hmlqNcgvLt6gi2hFWYIxMi28wJkow Ecy3dD6slV28ljLXmbdsak6kIasDQYxzbSJPQNmBilG8HEH2oDdltL/M0u2IudeUYdlMM3zm1uKo nSeIUpBDWNMJirNrF3lG7nfvDdHYa2GJpjioJ3UWa1lAwBgUqlW9I/H07ziHQMDMMmPgrod3z+/u 8ipXMuLvi5/hQvMkB/o9t5+UAvG+RcM9FjE+PyHM9dSJX1tfWwuMCTN5zJz+C4lD5n0OK7+oOdmI NxccLrcMk9xd4RHpTiG7C00HslA260o7h7iJIewiQ9B/13s9v6oDMOTYmp21yF8DZ75Orq1zqib3 qWvwWhByw8VY877ywuSoRSbKdFDvVKQKnZvqTSYTt0e43lrGZnvQdJhIt0ZbJHej3qMh3BMtKVpU 9xSwsB70uJYhVLWO9JguDPBK1Lr9bPpwwIqHHePawJZ6w0BNLwetAZRRFgM4WkFU0bmWWNkfq6H5 uO0yLdRcjSUQ8Ur04Wpuv2gbMTqS6XiGpStMrptaB7wO9S3feOeQLxwtZ+03XOYMGSq8j4DxfJiK 8YyIzwjMTQYEaHZLPCTOUKB58x0LnXCrjktcNOamKoW3P4SllbZONZZtqmI93gx5Ofl6NzWalK9B TnVVhmcO7dg2djjMFaXmMmZkk5LgUhyLk0tBTngQ8S3Sk6OhsJGD1B3oAzKxeHMqr0JERaUigDim FqZ09F9MopVmyksJH7HlzVpMciJw1MYZg0g14qXzphvGwH5ntUoXDW7Os2r5E0SehJ24E1GW0bZY 94DU5iD1sG8FfZwXpsX1TCAom3MKq1oGc6cDqx3H2ZJbdMOgqwJrfL89lopiOamUq1yhZQkTaRbV tiYBQqp4Oes7jxYa9uEaeWfGYxd4d/Q20xtsexIyFIORJaXx46u3YkXr0fMsOK1Lz3HSnJe03A1B yFxM/89qYdeQYismIkGHpTgvMvU2KAYTNVd2H0YOkZuWcAuSL8beHVicM1BazPRIjbK1J4Ay1GUQ bSdSSu1MbMi7hhCkpRiFMxHINxLQ/VCttJ3ubnCRNq9qaRL61jAXxgqipWIEUaBsgOcTTzsCflQW g3ZWmcPWMKsTQswjhsO+vfIPiyblgg7A1lv4q0xDuKB6xDJBoAbzV8Y2NeP9oDSKslIZHCKx0i57 eVXCFs3YhBWap1tND7GTDN4NuNVe2Wm+pxB3O5rFFyLDY+lckc4hjHFY8GB0kfUi10oGYQfFBBQE +ax0SCi6EucctpmPUsA20q6W4VfcuwGd2BNbKZhsL561TOpukFOocspQxtSb2xDVHDMFHJFm59bm aS2QQ/WbOaAWK2QnKRyMnqaWGCTA0s03CgtGtBKkdWMsed0lSNLcoHSj4QpFxWdLLBmDThG4xGtu uJpiFetJ6QHUHqTMY9NGNYPgMJqJxLiyB2EwwW46MjI5qUQYixTsTTaauiROcdmzswXjUZLw6LSj K44sA5rpkywI9KVb+Fo3r7jfuWKhe1QpQFl7AIkSO1qE9iKQyunezJesRFWIIjxF2ao59hiIqdl+ xLuOkE+UMHHJd/xdyRThQkGAcrDE --===============0591645326==--