File: xa_prepare_unlock_unmodified.test

package info (click to toggle)
mariadb 1%3A11.8.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 772,520 kB
  • sloc: ansic: 2,414,714; cpp: 1,791,394; asm: 381,336; perl: 62,905; sh: 49,647; pascal: 40,897; java: 39,363; python: 20,791; yacc: 20,432; sql: 17,907; xml: 12,344; ruby: 8,544; cs: 6,542; makefile: 6,145; ada: 1,879; lex: 1,193; javascript: 996; objc: 80; tcl: 73; awk: 46; php: 22
file content (98 lines) | stat: -rw-r--r-- 3,329 bytes parent folder | download | duplicates (4)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
--source include/have_innodb.inc
--source include/count_sessions.inc
--source include/have_debug.inc
--source include/have_sequence.inc

SET @old_innodb_enable_xap_unlock_unmodified_for_primary_debug=
  @@GLOBAL.innodb_enable_xap_unlock_unmodified_for_primary_debug;
SET GLOBAL innodb_enable_xap_unlock_unmodified_for_primary_debug= 1;

# Make sure there is no dynamic memory allocation during getting offsets for
# 32 columns of secondary index with 32 columns of primary index in
# lock_rec_unlock_unmodified().
DELIMITER $$;
BEGIN NOT ATOMIC
  DECLARE c TEXT DEFAULT(
    SELECT CONCAT(
      'CREATE TABLE t1(pk',
         GROUP_CONCAT(seq SEPARATOR ' INT, pk'), ' INT, a',
         GROUP_CONCAT(seq SEPARATOR ' INT, a'), ' INT, b',
         GROUP_CONCAT(seq SEPARATOR ' INT, b'), ' INT, c INT, PRIMARY KEY(pk',
         GROUP_CONCAT(seq SEPARATOR ', pk'), '), INDEX i1(a',
         GROUP_CONCAT(seq SEPARATOR ', a'), '), INDEX i2(b',
         GROUP_CONCAT(seq SEPARATOR ', b'), ')) ENGINE=InnoDB;')
      FROM seq_1_to_32);
  EXECUTE IMMEDIATE c;
END;
$$
BEGIN NOT ATOMIC
  DECLARE c TEXT DEFAULT(
    SELECT CONCAT(
      'INSERT INTO t1 VALUES (',
         GROUP_CONCAT('1' SEPARATOR ','), ',',
         GROUP_CONCAT('1' SEPARATOR ','), ',',
         GROUP_CONCAT('1' SEPARATOR ','), ',0), (',

         GROUP_CONCAT('2' SEPARATOR ','), ',',
         GROUP_CONCAT('1' SEPARATOR ','), ',',
         GROUP_CONCAT('2' SEPARATOR ','), ',0), (',

         GROUP_CONCAT('3' SEPARATOR ','), ',',
         GROUP_CONCAT('2' SEPARATOR ','), ',',
         GROUP_CONCAT('1' SEPARATOR ','), ',0), (',

         GROUP_CONCAT('4' SEPARATOR ','), ',',
         GROUP_CONCAT('2' SEPARATOR ','), ',',
         GROUP_CONCAT('2' SEPARATOR ','), ',0);')
      FROM seq_1_to_32);
  EXECUTE IMMEDIATE c;
END;
$$
DELIMITER ;$$

SET @old_timeout= @@GLOBAL.innodb_lock_wait_timeout;
SET GLOBAL innodb_lock_wait_timeout= 1;

XA START "t1";
UPDATE t1 FORCE INDEX (i2) SET c=c+1 WHERE a1=1 AND b1=1;
XA END "t1";
# If there is dynamic memory allocation during getting offsets for
# 32 columns of secondary index with 32 columns of primary index in
# lock_rec_unlock_unmodified(), the following statement will cause assertion
# failure in debug build.
XA PREPARE "t1";

--connect(con1,localhost,root,,)
# (pk, 2, 1, 0) record is X-locked but not modified in clustered index with the
# above XA transaction, if the bug is not fixed, the following SELECT will be
# blocked by the XA transaction if XA PREPARE does not release the unmodified
# record.
SELECT a1, b1, c  FROM t1 FORCE INDEX (i1) WHERE a1=2 AND b1=1 FOR UPDATE;
--disconnect con1

--connection default
XA COMMIT "t1";

SET GLOBAL innodb_enable_xap_unlock_unmodified_for_primary_debug=
  @old_innodb_enable_xap_unlock_unmodified_for_primary_debug;

SET GLOBAL innodb_lock_wait_timeout= @old_timeout;

# Check that we can't create secondary index with more than 32 columns.
DELIMITER $$;
--error ER_TOO_MANY_KEY_PARTS
BEGIN NOT ATOMIC
  DECLARE c TEXT DEFAULT(
    SELECT CONCAT(
      'ALTER TABLE t1 ADD COLUMN d',
         GROUP_CONCAT(seq SEPARATOR ' INT, ADD COLUMN d'),
         ' INT, ADD INDEX i3(d',
         GROUP_CONCAT(seq SEPARATOR ', d'), ');')
      FROM seq_1_to_33);
  EXECUTE IMMEDIATE c;
END;
$$
DELIMITER ;$$

DROP TABLE t1;
--source include/wait_until_count_sessions.inc