File: innodb_too_many_columns.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 (131 lines) | stat: -rw-r--r-- 4,345 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#############################################################################
# Bug#32788564: TOO MANY COLUMNS ON PARTITIONED TABLE MAKES DATABASE BROKEN #
#############################################################################

--source include/have_innodb_16k.inc

# This test verifies the bug#32788564 where the server crashed while
# executing TRUNCATE TABLE on a partitioned table, if an
# ALTER TABLE ADD COLUMN failed to add columns because of hitting the
# upper limit on the number of columns in a table

DELIMITER |;

# Procedure to add enough columns to a table such that it reaches the maximum
# number of columns allowed on a table
CREATE PROCEDURE add_columns(table_name varchar(50), algorithm varchar(10))
BEGIN
  DECLARE i INT DEFAULT 1;
  SET @sql_text = CONCAT('ALTER TABLE ', table_name, ' ');
  while (i < 1012) do
    SET @sql_text = CONCAT(@sql_text, ' ADD COLUMN ', CONCAT('col_', i), ' INTEGER NULL DEFAULT NULL,');
    set i = i + 1;
  end while;
  SET @sql_text = CONCAT(@sql_text, 'ALGORITHM=', algorithm);
  PREPARE stmt FROM @sql_text;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END|

CREATE PROCEDURE create_tables()
BEGIN
# Create a non-partitioned table
  CREATE TABLE `test`.`TEST_TABLE` (
    `TIMESTAMP` datetime NOT NULL,
    `INTERVALL` int NOT NULL,
    `IDENT_KEY` int NOT NULL,
    `FIELD_1` double DEFAULT NULL,
    `FIELD_2` double DEFAULT NULL,
    `FIELD_3` double DEFAULT NULL
  );

# Create a partitioned table
  CREATE TABLE `test`.`TEST_TABLE_PARTITIONED` (
    `TIMESTAMP` datetime NOT NULL,
    `INTERVALL` int NOT NULL,
    `IDENT_KEY` int NOT NULL,
    `FIELD_1` double DEFAULT NULL,
    `FIELD_2` double DEFAULT NULL,
    `FIELD_3` double DEFAULT NULL
  )
  PARTITION BY RANGE COLUMNS(`TIMESTAMP`)
  (
    PARTITION p20210321 VALUES LESS THAN ('2021-03-22'),
    PARTITION p20210322 VALUES LESS THAN ('2021-03-23'),
    PARTITION p20210323 VALUES LESS THAN MAXVALUE
  );
END |
DELIMITER ;|

# Test ALTER TABLE ... ADD COLUMN both on partitioned and unpartitioned
# tables using all the possible algorithms viz. INPLACE, INSTANT, COPY
# and verify that the table can be truncate even after the
# ALTER TABLE ... ADD COLUMN fails

# Test for ALGORITHM=INPLACE
call create_tables();
call add_columns('TEST_TABLE', 'INPLACE');
call add_columns('TEST_TABLE_PARTITIONED', 'INPLACE');

--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE TEST_TABLE ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=INPLACE;

--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE TEST_TABLE_PARTITIONED ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=INPLACE;

TRUNCATE TABLE TEST_TABLE;
TRUNCATE TABLE TEST_TABLE_PARTITIONED;
DROP TABLE TEST_TABLE;
DROP TABLE TEST_TABLE_PARTITIONED;

# Test for ALGORITHM=INSTANT
call create_tables();
call add_columns('TEST_TABLE', 'INSTANT');
call add_columns('TEST_TABLE_PARTITIONED', 'INSTANT');

--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE TEST_TABLE ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=INSTANT;

--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
ALTER TABLE TEST_TABLE_PARTITIONED ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=INSTANT;

TRUNCATE TABLE TEST_TABLE;
TRUNCATE TABLE TEST_TABLE_PARTITIONED;
DROP TABLE TEST_TABLE;
DROP TABLE TEST_TABLE_PARTITIONED;

# Test for ALGORITHM=COPY
call create_tables();
call add_columns('TEST_TABLE', 'COPY');
call add_columns('TEST_TABLE_PARTITIONED', 'COPY');

--error ER_TOO_MANY_FIELDS
ALTER TABLE TEST_TABLE ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=COPY;

--error ER_TOO_MANY_FIELDS
ALTER TABLE TEST_TABLE_PARTITIONED ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=COPY;

TRUNCATE TABLE TEST_TABLE;
TRUNCATE TABLE TEST_TABLE_PARTITIONED;
DROP TABLE TEST_TABLE;
DROP TABLE TEST_TABLE_PARTITIONED;

# Test for ALGORITHM=DEFAULT
call create_tables();
call add_columns('TEST_TABLE', 'DEFAULT');
call add_columns('TEST_TABLE_PARTITIONED', 'DEFAULT');

--error ER_TOO_MANY_FIELDS
ALTER TABLE TEST_TABLE ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=DEFAULT;

--error ER_TOO_MANY_FIELDS
ALTER TABLE TEST_TABLE_PARTITIONED ADD I_VJ278 INTEGER NULL DEFAULT NULL, ALGORITHM=DEFAULT;

TRUNCATE TABLE TEST_TABLE;
TRUNCATE TABLE TEST_TABLE_PARTITIONED;
DROP TABLE TEST_TABLE;
DROP TABLE TEST_TABLE_PARTITIONED;

# Cleanup
DROP PROCEDURE create_tables;
DROP PROCEDURE add_columns;