mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-4791: Assertion range_end >= range_start fails in log0online.c
on select from I_S.INNODB_CHANGED_PAGES Analysis: limit_lsn_range_from_condition() incorrectly parses start_lsn and/or end_lsn conditions. Fix from SergeyP. Added some test cases.
This commit is contained in:
72
mysql-test/suite/innodb/r/innodb-changed-pages.result
Normal file
72
mysql-test/suite/innodb/r/innodb-changed-pages.result
Normal file
@ -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
|
@ -0,0 +1 @@
|
|||||||
|
--innodb-track-changed-pages=0 --innodb-changed-pages=1
|
63
mysql-test/suite/innodb/t/innodb-changed-pages.test
Normal file
63
mysql-test/suite/innodb/t/innodb-changed-pages.test
Normal file
@ -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);
|
||||||
|
|
@ -8205,9 +8205,12 @@ limit_lsn_range_from_condition(
|
|||||||
if (left->type() == Item::FIELD_ITEM
|
if (left->type() == Item::FIELD_ITEM
|
||||||
&& right->type() == Item::INT_ITEM) {
|
&& right->type() == Item::INT_ITEM) {
|
||||||
|
|
||||||
/* The case of start_lsn|end_lsn <|<= const, i.e. the
|
/* The case of start_lsn|end_lsn <|<= const
|
||||||
upper bound. */
|
"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();
|
tmp_result = right->val_int();
|
||||||
if (((func_type == Item_func::LE_FUNC)
|
if (((func_type == Item_func::LE_FUNC)
|
||||||
|| (func_type == Item_func::GE_FUNC))
|
|| (func_type == Item_func::GE_FUNC))
|
||||||
@ -8218,13 +8221,18 @@ limit_lsn_range_from_condition(
|
|||||||
if (tmp_result < *end_lsn) {
|
if (tmp_result < *end_lsn) {
|
||||||
*end_lsn = tmp_result;
|
*end_lsn = tmp_result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else if (left->type() == Item::INT_ITEM
|
} else if (left->type() == Item::INT_ITEM
|
||||||
&& right->type() == Item::FIELD_ITEM) {
|
&& right->type() == Item::FIELD_ITEM) {
|
||||||
|
|
||||||
/* The case of const <|<= start_lsn|end_lsn, i.e. the
|
/* The case of const <|<= start_lsn|end_lsn
|
||||||
lower bound */
|
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();
|
tmp_result = left->val_int();
|
||||||
if (is_end_lsn && tmp_result != 0) {
|
if (is_end_lsn && tmp_result != 0) {
|
||||||
tmp_result--;
|
tmp_result--;
|
||||||
@ -8239,6 +8247,7 @@ limit_lsn_range_from_condition(
|
|||||||
*start_lsn = tmp_result;
|
*start_lsn = tmp_result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user