=== added file 'mysql-test/suite/innodb/r/innodb-changed-pages.result' --- mysql-test/suite/innodb/r/innodb-changed-pages.result 1970-01-01 00:00:00 +0000 +++ mysql-test/suite/innodb/r/innodb-changed-pages.result 2014-05-09 08:43:53 +0000 @@ -0,0 +1,72 @@ +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 10 AND end_lsn > 20 ; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA . `INNODB_CHANGED_PAGES` AS table1 WHERE ( ( (NOT ( ( ( ( (NOT ( table1 . `page_id` <> table1 . `start_lsn` AND table1 . `space_id` <> 8) AND table1 . `page_id` >= table1 . `end_lsn`) OR table1 . `end_lsn` = table1 . `space_id`) AND table1 . `end_lsn` <> table1 . `page_id`) OR table1 . `end_lsn` < 8) AND table1 . `space_id` >= '2000-06-10 11:33:07.046821') AND table1 . `end_lsn` >= 5) AND table1 . `start_lsn` < 'mm') OR table1 . `end_lsn` != table1 . `end_lsn`) HAVING ( table1 . `start_lsn` < '2005-09-09 01:34:19.012946' OR table1 . `page_id` < 6) ORDER BY table1 . `start_lsn` +LIMIT 3; +space_id page_id start_lsn end_lsn +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'mm' +Warning 1292 Truncated incorrect DOUBLE value: '2005-09-09 01:34:19.012946' +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn > 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn >= 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn > 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn >= 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 and end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 and end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 and end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 and end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn = 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn = 2000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn < 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn <= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn > 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn > 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn >= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn >= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn > 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn > 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn >= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn >= 3000000; +space_id page_id start_lsn end_lsn +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE (start_lsn > 2000000 and end_lsn < 3000000) or (start_lsn > 4000000 and end_lsn < 5000000); +space_id page_id start_lsn end_lsn === added file 'mysql-test/suite/innodb/t/innodb-changed-pages-master.opt' --- mysql-test/suite/innodb/t/innodb-changed-pages-master.opt 1970-01-01 00:00:00 +0000 +++ mysql-test/suite/innodb/t/innodb-changed-pages-master.opt 2014-05-09 08:43:53 +0000 @@ -0,0 +1,1 @@ +--innodb-track-changed-pages=0 --innodb-changed-pages=1 \ No newline at end of file === added file 'mysql-test/suite/innodb/t/innodb-changed-pages.test' --- mysql-test/suite/innodb/t/innodb-changed-pages.test 1970-01-01 00:00:00 +0000 +++ mysql-test/suite/innodb/t/innodb-changed-pages.test 2014-05-09 08:43:53 +0000 @@ -0,0 +1,63 @@ +-- source include/have_xtradb.inc + +# +# This test requires innodb-changed-pages=1 so that necessary information schema table exists +# and innodb-track-changed-pages=0 to disable actual changed pages tracking, because +# page number are not consistent from run to run +# + +# +# MDEV-4791: ssertion range_end >= range_start fails in log0online.c +# on select from I_S.INNODB_CHANGED_PAGES + +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 10 AND end_lsn > 20 ; + +SELECT * FROM INFORMATION_SCHEMA . `INNODB_CHANGED_PAGES` AS table1 WHERE ( ( (NOT ( ( ( ( (NOT ( table1 . `page_id` <> table1 . `start_lsn` AND table1 . `space_id` <> 8) AND table1 . `page_id` >= table1 . `end_lsn`) OR table1 . `end_lsn` = table1 . `space_id`) AND table1 . `end_lsn` <> table1 . `page_id`) OR table1 . `end_lsn` < 8) AND table1 . `space_id` >= '2000-06-10 11:33:07.046821') AND table1 . `end_lsn` >= 5) AND table1 . `start_lsn` < 'mm') OR table1 . `end_lsn` != table1 . `end_lsn`) HAVING ( table1 . `start_lsn` < '2005-09-09 01:34:19.012946' OR table1 . `page_id` < 6) ORDER BY table1 . `start_lsn` +LIMIT 3; + +# +# Basic tests +# + +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn > 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn >= 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn > 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn >= 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 and end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 and end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 and end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 and end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn = 2000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE end_lsn = 2000000; + +# +# OR +# +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn < 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn <= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn > 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn > 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn < 2000000 or end_lsn >= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn <= 2000000 or end_lsn >= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn > 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn > 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn > 2000000 or end_lsn >= 3000000; +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE start_lsn >= 2000000 or end_lsn >= 3000000; + +# +# Range +# +SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES WHERE (start_lsn > 2000000 and end_lsn < 3000000) or (start_lsn > 4000000 and end_lsn < 5000000); + === modified file 'storage/xtradb/handler/i_s.cc' --- storage/xtradb/handler/i_s.cc 2014-05-07 15:33:33 +0000 +++ storage/xtradb/handler/i_s.cc 2014-05-09 08:43:53 +0000 @@ -8205,38 +8205,47 @@ if (left->type() == Item::FIELD_ITEM && right->type() == Item::INT_ITEM) { - /* The case of start_lsn|end_lsn <|<= const, i.e. the - upper bound. */ - - tmp_result = right->val_int(); - if (((func_type == Item_func::LE_FUNC) - || (func_type == Item_func::GE_FUNC)) - && (tmp_result != IB_UINT64_MAX)) { - - tmp_result++; - } - if (tmp_result < *end_lsn) { - *end_lsn = tmp_result; + /* The case of start_lsn|end_lsn <|<= const + "end_lsn <=? const" gives a valid upper bound. + "start_lsn <=? const" is not a valid upper bound. + */ + + if (is_end_lsn) { + tmp_result = right->val_int(); + if (((func_type == Item_func::LE_FUNC) + || (func_type == Item_func::GE_FUNC)) + && (tmp_result != IB_UINT64_MAX)) { + + tmp_result++; + } + if (tmp_result < *end_lsn) { + *end_lsn = tmp_result; + } } } else if (left->type() == Item::INT_ITEM && right->type() == Item::FIELD_ITEM) { - /* The case of const <|<= start_lsn|end_lsn, i.e. the - lower bound */ - - tmp_result = left->val_int(); - if (is_end_lsn && tmp_result != 0) { - tmp_result--; - } - if (((func_type == Item_func::LT_FUNC) - || (func_type == Item_func::GT_FUNC)) - && (tmp_result != IB_UINT64_MAX)) { - - tmp_result++; - } - if (tmp_result > *start_lsn) { - *start_lsn = tmp_result; + /* The case of const <|<= start_lsn|end_lsn + turning it around: start_lsn|end_lsn >|>= const + "start_lsn >=? const " is a valid loer bound. + "end_lsn >=? const" is not a valid lower bound. + */ + + if (!is_end_lsn) { + tmp_result = left->val_int(); + if (is_end_lsn && tmp_result != 0) { + tmp_result--; + } + if (((func_type == Item_func::LT_FUNC) + || (func_type == Item_func::GT_FUNC)) + && (tmp_result != IB_UINT64_MAX)) { + + tmp_result++; + } + if (tmp_result > *start_lsn) { + *start_lsn = tmp_result; + } } }