File: builder_error_case.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (74 lines) | stat: -rw-r--r-- 2,714 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
--source include/have_debug.inc
# Bug scenario:
# When DDL is on-going and hits an error (for example when row log is full or
# duplicate key entry is found); it must rollback and cleanup correctly.
# The error handling code must call m_btr_load->finish and ensure that all pages
# buffer fixed are released.

--echo # Create big enough table to ensure another call to Builder::insert_direct
CREATE TABLE t1 (c1 INT);

--disable_query_log
DELIMITER |;
CREATE PROCEDURE populate_t1(IN BASE INT, IN SIZE INT)
BEGIN
  DECLARE i INT DEFAULT BASE;
  WHILE (i + 10 <= SIZE) DO
    INSERT INTO t1 values (i), (i+1), (i+2), (i+3), (i+4), (i+5), (i+6), (i+7), (i+8), (i+9);
    SET i = i + 10;
  END WHILE;
END|
DELIMITER ;|

# Note that inserting anything less than 10700 doesn't cause key_buffer to
# overflow on 32 bit platforms - this causes a single call to
# Builder::insert_direct. In case of 64 bit platforms, this number is 9892. The
# reason for this difference is because of different values for sizeof the
# Key_sort_buffer::m_dtuples on different architecture. Kept at 11000 just to be
# ensure second call to Builder::insert_direct
CALL populate_t1(0, 11000);
DROP PROCEDURE populate_t1;
--enable_query_log

SELECT COUNT(*) FROM t1;

--echo # Builder::insert_direct returns DB_ONLINE_LOG_TOO_BIG
SET DEBUG="+d,builder_insert_direct_trigger_error";
--error ER_INNODB_ONLINE_LOG_TOO_BIG
ALTER TABLE t1 ADD COLUMN c2 INT DEFAULT 20, ALGORITHM=INPLACE;
SET DEBUG="-d,builder_insert_direct_trigger_error";

--echo # Builder::add_row returns DB_ONLINE_LOG_TOO_BIG
SET DEBUG="+d,builder_add_row_trigger_error";
--error ER_INNODB_ONLINE_LOG_TOO_BIG
ALTER TABLE t1 ADD COLUMN c2 INT DEFAULT 20, ALGORITHM=INPLACE;
SET DEBUG="-d,builder_add_row_trigger_error";

call mtr.add_suppression("\\[InnoDB\\] DDL failed as Builder is already freed");

--echo # Builder::bulk_add_row returns DB_DUPLICATE_KEY
SET DEBUG="+d,builder_bulk_add_row_trigger_error_1";
OPTIMIZE TABLE t1;
SET DEBUG="-d,builder_bulk_add_row_trigger_error_1";

--echo # Builder::bulk_add_row returns DB_INVALID_NULL
SET DEBUG="+d,builder_bulk_add_row_trigger_error_2";
OPTIMIZE TABLE t1;
SET DEBUG="-d,builder_bulk_add_row_trigger_error_2";

--echo # Builder::bulk_add_row returns DB_IO_ERROR
SET DEBUG="+d,builder_bulk_add_row_trigger_error_3";
OPTIMIZE TABLE t1;
SET DEBUG="-d,builder_bulk_add_row_trigger_error_3";

--echo # ddl::pwrite returns DB_IO_ERROR
SET DEBUG="+d,builder_bulk_add_row_trigger_error_4";
OPTIMIZE TABLE t1;
SET DEBUG="-d,builder_bulk_add_row_trigger_error_4";

--echo # Pages still buffer fixed should assert during shutdown
--source include/shutdown_mysqld.inc
--source include/start_mysqld.inc

--echo # Cleanup
DROP TABLE t1;