mirror of
https://github.com/MariaDB/server.git
synced 2025-11-15 09:02:33 +03:00
Analysis: Lengths which are not UNIV_SQL_NULL, but bigger than the following number indicate that a field contains a reference to an externally stored part of the field in the tablespace. The length field then contains the sum of the following flag and the locally stored len. This was incorrectly set to define UNIV_EXTERN_STORAGE_FIELD (UNIV_SQL_NULL - UNIV_PAGE_SIZE_MAX) When it should be define UNIV_EXTERN_STORAGE_FIELD (UNIV_SQL_NULL - UNIV_PAGE_SIZE_DEF) Additionally, we need to disable support for > 16K page size for row compressed tables because a compressed page directory entry reserves 14 bits for the start offset and 2 bits for flags. This limits the uncompressed page size to 16k. To support larger pages page directory entry needs to be larger.
81 lines
2.5 KiB
Plaintext
81 lines
2.5 KiB
Plaintext
if (`select plugin_auth_version < "5.6.17" from information_schema.plugins where plugin_name='innodb'`)
|
|
{
|
|
--skip Not fixed in InnoDB before 5.6.17
|
|
}
|
|
|
|
--echo #
|
|
--echo # Bug#69122 - INNODB DOESN'T REDO-LOG INSERT BUFFER MERGE
|
|
--echo # OPERATION IF IT IS DONE IN-PLACE
|
|
--echo #
|
|
--source include/have_innodb.inc
|
|
# innodb_change_buffering_debug option is debug only
|
|
--source include/have_debug.inc
|
|
# Embedded server does not support crashing
|
|
--source include/not_embedded.inc
|
|
# DBUG_SUICIDE() hangs under valgrind
|
|
--source include/not_valgrind.inc
|
|
# No windows, need perl
|
|
--source include/not_windows.inc
|
|
|
|
# The flag innodb_change_buffering_debug is only available in debug builds.
|
|
# It instructs InnoDB to try to evict pages from the buffer pool when
|
|
# change buffering is possible, so that the change buffer will be used
|
|
# whenever possible.
|
|
SET GLOBAL innodb_change_buffering_debug = 1;
|
|
let SEARCH_FILE = $MYSQLTEST_VARDIR/tmp/my_restart.err;
|
|
|
|
CREATE TABLE t1(
|
|
a INT AUTO_INCREMENT PRIMARY KEY,
|
|
b CHAR(1),
|
|
c INT,
|
|
INDEX(b))
|
|
ENGINE=InnoDB;
|
|
|
|
# Create enough rows for the table, so that the change buffer will be
|
|
# used for modifying the secondary index page. There must be multiple
|
|
# index pages, because changes to the root page are never buffered.
|
|
INSERT INTO t1 VALUES(0,'x',1);
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
INSERT INTO t1 SELECT 0,b,c FROM t1;
|
|
|
|
BEGIN;
|
|
SELECT b FROM t1 LIMIT 3;
|
|
|
|
connect (con1,localhost,root,,);
|
|
connection con1;
|
|
BEGIN;
|
|
DELETE FROM t1 WHERE a=1;
|
|
# This should be buffered, if innodb_change_buffering_debug = 1 is in effect.
|
|
INSERT INTO t1 VALUES(1,'X',1);
|
|
|
|
SET DEBUG_DBUG='+d,crash_after_log_ibuf_upd_inplace';
|
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
--error 2013
|
|
# This should force a change buffer merge
|
|
SELECT b FROM t1 LIMIT 3;
|
|
|
|
let SEARCH_PATTERN=Wrote log record for ibuf update in place operation;
|
|
--source include/search_pattern_in_file.inc
|
|
|
|
# Write file to make mysql-test-run.pl start up the server again
|
|
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
|
--enable_reconnect
|
|
--source include/wait_until_connected_again.inc
|
|
|
|
CHECK TABLE t1;
|
|
|
|
# Cleanup
|
|
DROP TABLE t1;
|