~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/mysql-test/innodb-autoinc.test

  • Committer: Brian Aker
  • Date: 2008-12-15 19:32:58 UTC
  • mfrom: (677.1.2 devel)
  • Revision ID: brian@tangent.org-20081215193258-fsvc1sh9h7a9sb1t
Merge from Monty

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
-- source include/have_innodb.inc
 
2
# embedded server ignores 'delayed', so skip this
 
3
-- source include/not_embedded.inc
 
4
 
 
5
--disable_warnings
 
6
drop table if exists t1;
 
7
--enable_warnings
 
8
 
 
9
#
 
10
# Bug #34335
 
11
#
 
12
CREATE TABLE t1 (c1 BIGINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
13
INSERT INTO t1 VALUES (9223372036854775807, null);
 
14
-- error ER_DUP_ENTRY,1062
 
15
INSERT INTO t1 (c2) VALUES ('innodb');
 
16
SELECT * FROM t1;
 
17
DROP TABLE t1;
 
18
#
 
19
## Test AUTOINC overflow
 
20
##
 
21
 
 
22
# TINYINT
 
23
CREATE TABLE t1 (c1 TINYINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
24
INSERT INTO t1 VALUES (127, null);
 
25
-- error ER_DUP_ENTRY,1062
 
26
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
27
INSERT INTO t1 (c2) VALUES ('innodb');
 
28
SELECT * FROM t1;
 
29
DROP TABLE t1;
 
30
 
 
31
CREATE TABLE t1 (c1 TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
32
INSERT INTO t1 VALUES (255, null);
 
33
-- error ER_DUP_ENTRY,1062
 
34
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
35
INSERT INTO t1 (c2) VALUES ('innodb');
 
36
SELECT * FROM t1;
 
37
DROP TABLE t1;
 
38
#
 
39
# SMALLINT
 
40
#
 
41
CREATE TABLE t1 (c1 SMALLINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
42
INSERT INTO t1 VALUES (32767, null);
 
43
-- error ER_DUP_ENTRY,1062
 
44
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
45
INSERT INTO t1 (c2) VALUES ('innodb');
 
46
SELECT * FROM t1;
 
47
DROP TABLE t1;
 
48
 
 
49
CREATE TABLE t1 (c1 SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
50
INSERT INTO t1 VALUES (65535, null);
 
51
-- error ER_DUP_ENTRY,1062
 
52
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
53
INSERT INTO t1 (c2) VALUES ('innodb');
 
54
SELECT * FROM t1;
 
55
DROP TABLE t1;
 
56
#
 
57
# MEDIUMINT
 
58
#
 
59
CREATE TABLE t1 (c1 MEDIUMINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
60
INSERT INTO t1 VALUES (8388607, null);
 
61
-- error ER_DUP_ENTRY,1062
 
62
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
63
INSERT INTO t1 (c2) VALUES ('innodb');
 
64
SELECT * FROM t1;
 
65
DROP TABLE t1;
 
66
 
 
67
CREATE TABLE t1 (c1 MEDIUMINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
68
INSERT INTO t1 VALUES (16777215, null);
 
69
-- error ER_DUP_ENTRY,1062
 
70
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
71
INSERT INTO t1 (c2) VALUES ('innodb');
 
72
SELECT * FROM t1;
 
73
DROP TABLE t1;
 
74
#
 
75
# INT
 
76
#
 
77
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
78
INSERT INTO t1 VALUES (2147483647, null);
 
79
-- error ER_DUP_ENTRY,1062
 
80
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
81
INSERT INTO t1 (c2) VALUES ('innodb');
 
82
SELECT * FROM t1;
 
83
DROP TABLE t1;
 
84
 
 
85
CREATE TABLE t1 (c1 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
86
INSERT INTO t1 VALUES (4294967295, null);
 
87
-- error ER_DUP_ENTRY,1062
 
88
INSERT INTO t1 (c2) VALUES ('innodb');
 
89
SELECT * FROM t1;
 
90
DROP TABLE t1;
 
91
#
 
92
# BIGINT
 
93
#
 
94
CREATE TABLE t1 (c1 BIGINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
95
INSERT INTO t1 VALUES (9223372036854775807, null);
 
96
-- error ER_DUP_ENTRY,1062
 
97
-- warning ER_WARN_DATA_OUT_OF_RANGE,1264
 
98
INSERT INTO t1 (c2) VALUES ('innodb');
 
99
SELECT * FROM t1;
 
100
DROP TABLE t1;
 
101
 
 
102
CREATE TABLE t1 (c1 BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
 
103
INSERT INTO t1 VALUES (18446744073709551615, null);
 
104
-- error ER_AUTOINC_READ_FAILED,1467
 
105
INSERT INTO t1 (c2) VALUES ('innodb');
 
106
SELECT * FROM t1;
 
107
DROP TABLE t1;
 
108
 
 
109
#
 
110
# Bug 37531
 
111
# After truncate, auto_increment behaves incorrectly for InnoDB
 
112
#
 
113
CREATE TABLE t1(c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
 
114
INSERT INTO t1 VALUES (1), (2), (3);
 
115
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
 
116
SELECT c1 FROM t1;
 
117
SHOW CREATE TABLE t1;
 
118
TRUNCATE TABLE t1;
 
119
SHOW CREATE TABLE t1;
 
120
INSERT INTO t1 VALUES (1), (2), (3);
 
121
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
 
122
SELECT c1 FROM t1;
 
123
SHOW CREATE TABLE t1;
 
124
DROP TABLE t1;
 
125
 
 
126
#
 
127
# Deleting all records should not reset the AUTOINC counter.
 
128
#
 
129
CREATE TABLE t1(c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
 
130
INSERT INTO t1 VALUES (1), (2), (3);
 
131
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
 
132
SELECT c1 FROM t1;
 
133
SHOW CREATE TABLE t1;
 
134
DELETE FROM t1;
 
135
SHOW CREATE TABLE t1;
 
136
INSERT INTO t1 VALUES (1), (2), (3);
 
137
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
 
138
SELECT c1 FROM t1;
 
139
SHOW CREATE TABLE t1;
 
140
DROP TABLE t1;
 
141
 
 
142
#
 
143
# Bug 38839
 
144
# Reset the last value generated at end of statement
 
145
#
 
146
DROP TABLE IF EXISTS t1;
 
147
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
148
INSERT INTO t1 VALUES (NULL, 1);
 
149
DELETE FROM t1 WHERE c1 = 1;
 
150
INSERT INTO t1 VALUES (2,1); 
 
151
INSERT INTO t1 VALUES (NULL,8);
 
152
SELECT * FROM t1;
 
153
DROP TABLE t1;
 
154
# Bug 38839 -- same as above but for multi value insert
 
155
DROP TABLE IF EXISTS t1;
 
156
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
157
INSERT INTO t1 VALUES (NULL, 1);
 
158
DELETE FROM t1 WHERE c1 = 1;
 
159
INSERT INTO t1 VALUES (2,1), (NULL, 8);
 
160
INSERT INTO t1 VALUES (NULL,9);
 
161
SELECT * FROM t1;
 
162
DROP TABLE t1;
 
163
 
 
164
#
 
165
# Test changes to AUTOINC next value calculation
 
166
SET @@SESSION.AUTO_INCREMENT_INCREMENT=100, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
167
SHOW VARIABLES LIKE "%auto_inc%";
 
168
DROP TABLE IF EXISTS t1;
 
169
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
170
INSERT INTO t1 VALUES (NULL),(5),(NULL);
 
171
INSERT INTO t1 VALUES (250),(NULL);
 
172
SELECT * FROM t1;
 
173
INSERT INTO t1 VALUES (1000);
 
174
SET @@INSERT_ID=400;
 
175
INSERT INTO t1 VALUES(NULL),(NULL);
 
176
SELECT * FROM t1;
 
177
DROP TABLE t1;
 
178
 
 
179
# Test with SIGNED INT column, by inserting a 0 for the first column value
 
180
# 0 is treated in the same was NULL.
 
181
# Reset the AUTOINC session variables
 
182
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
183
SET @@INSERT_ID=1;
 
184
SHOW VARIABLES LIKE "%auto_inc%";
 
185
DROP TABLE IF EXISTS t1;
 
186
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
187
INSERT INTO t1 VALUES(0);
 
188
SELECT * FROM t1;
 
189
SET @@SESSION.AUTO_INCREMENT_INCREMENT=100, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
190
INSERT INTO t1 VALUES (-1), (NULL),(2),(NULL);
 
191
INSERT INTO t1 VALUES (250),(NULL);
 
192
SELECT * FROM t1;
 
193
SET @@INSERT_ID=400;
 
194
# Duplicate error expected here for autoinc_lock_mode != TRADITIONAL
 
195
-- error ER_DUP_ENTRY,1062
 
196
INSERT INTO t1 VALUES(NULL),(NULL);
 
197
SELECT * FROM t1;
 
198
DROP TABLE t1;
 
199
 
 
200
# Test with SIGNED INT column
 
201
# Reset the AUTOINC session variables
 
202
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
203
SET @@INSERT_ID=1;
 
204
SHOW VARIABLES LIKE "%auto_inc%";
 
205
DROP TABLE IF EXISTS t1;
 
206
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
207
INSERT INTO t1 VALUES(-1);
 
208
SELECT * FROM t1;
 
209
SET @@SESSION.AUTO_INCREMENT_INCREMENT=100, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
210
SHOW VARIABLES LIKE "%auto_inc%";
 
211
INSERT INTO t1 VALUES (-2), (NULL),(2),(NULL);
 
212
INSERT INTO t1 VALUES (250),(NULL);
 
213
SELECT * FROM t1;
 
214
INSERT INTO t1 VALUES (1000);
 
215
SET @@INSERT_ID=400;
 
216
INSERT INTO t1 VALUES(NULL),(NULL);
 
217
SELECT * FROM t1;
 
218
DROP TABLE t1;
 
219
 
 
220
# Test with UNSIGNED INT column, single insert
 
221
# The sign in the value is ignored and a new column value is generated
 
222
# Reset the AUTOINC session variables
 
223
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
224
SET @@INSERT_ID=1;
 
225
SHOW VARIABLES LIKE "%auto_inc%";
 
226
DROP TABLE IF EXISTS t1;
 
227
CREATE TABLE t1 (c1 INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
228
INSERT INTO t1 VALUES(-1);
 
229
SELECT * FROM t1;
 
230
SET @@SESSION.AUTO_INCREMENT_INCREMENT=100, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
231
SHOW VARIABLES LIKE "%auto_inc%";
 
232
INSERT INTO t1 VALUES (-2);
 
233
INSERT INTO t1 VALUES (NULL);
 
234
INSERT INTO t1 VALUES (2);
 
235
INSERT INTO t1 VALUES (NULL);
 
236
INSERT INTO t1 VALUES (250);
 
237
INSERT INTO t1 VALUES (NULL);
 
238
SELECT * FROM t1;
 
239
INSERT INTO t1 VALUES (1000);
 
240
SET @@INSERT_ID=400;
 
241
INSERT INTO t1 VALUES(NULL);
 
242
INSERT INTO t1 VALUES(NULL);
 
243
SELECT * FROM t1;
 
244
DROP TABLE t1;
 
245
 
 
246
# Test with UNSIGNED INT column, multi-value inserts
 
247
# The sign in the value is ignored and a new column value is generated
 
248
# Reset the AUTOINC session variables
 
249
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
250
SET @@INSERT_ID=1;
 
251
SHOW VARIABLES LIKE "%auto_inc%";
 
252
DROP TABLE IF EXISTS t1;
 
253
CREATE TABLE t1 (c1 INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
254
INSERT INTO t1 VALUES(-1);
 
255
SELECT * FROM t1;
 
256
SET @@SESSION.AUTO_INCREMENT_INCREMENT=100, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
257
SHOW VARIABLES LIKE "%auto_inc%";
 
258
INSERT INTO t1 VALUES (-2),(NULL),(2),(NULL);
 
259
INSERT INTO t1 VALUES (250),(NULL);
 
260
SELECT * FROM t1;
 
261
INSERT INTO t1 VALUES (1000);
 
262
SET @@INSERT_ID=400;
 
263
# Duplicate error expected here for autoinc_lock_mode != TRADITIONAL
 
264
-- error ER_DUP_ENTRY,1062
 
265
INSERT INTO t1 VALUES(NULL),(NULL);
 
266
SELECT * FROM t1;
 
267
DROP TABLE t1;
 
268
 
 
269
#
 
270
# Check for overflow handling when increment is > 1
 
271
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
272
SET @@INSERT_ID=1;
 
273
SHOW VARIABLES LIKE "%auto_inc%";
 
274
DROP TABLE IF EXISTS t1;
 
275
CREATE TABLE t1 (c1 BIGINT AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
276
# TODO: Fix the autoinc init code
 
277
# We have to do this because of a bug in the AUTOINC init code.
 
278
INSERT INTO t1 VALUES(NULL);
 
279
INSERT INTO t1 VALUES (9223372036854775794); -- 2^63 - 14
 
280
SELECT * FROM t1;
 
281
SET @@SESSION.AUTO_INCREMENT_INCREMENT=2, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
282
SHOW VARIABLES LIKE "%auto_inc%";
 
283
# This should just fit
 
284
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
 
285
SELECT * FROM t1;
 
286
DROP TABLE t1;
 
287
 
 
288
#
 
289
# Check for overflow handling when increment and offser are > 1
 
290
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
291
SET @@INSERT_ID=1;
 
292
SHOW VARIABLES LIKE "%auto_inc%";
 
293
DROP TABLE IF EXISTS t1;
 
294
CREATE TABLE t1 (c1 BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
295
# TODO: Fix the autoinc init code
 
296
# We have to do this because of a bug in the AUTOINC init code.
 
297
INSERT INTO t1 VALUES(NULL);
 
298
INSERT INTO t1 VALUES (18446744073709551603); -- 2^64 - 13
 
299
SELECT * FROM t1;
 
300
SET @@SESSION.AUTO_INCREMENT_INCREMENT=2, @@SESSION.AUTO_INCREMENT_OFFSET=10;
 
301
SHOW VARIABLES LIKE "%auto_inc%";
 
302
# This should fail because of overflow but it doesn't, it seems to be
 
303
# a MySQL server bug. It wraps around to 0 for the last value.
 
304
# See MySQL Bug# 39828
 
305
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
 
306
SELECT * FROM t1;
 
307
DROP TABLE t1;
 
308
 
 
309
#
 
310
# Check for overflow handling when increment and offset are odd numbers
 
311
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
312
SET @@INSERT_ID=1;
 
313
SHOW VARIABLES LIKE "%auto_inc%";
 
314
DROP TABLE IF EXISTS t1;
 
315
CREATE TABLE t1 (c1 BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
316
# TODO: Fix the autoinc init code
 
317
# We have to do this because of a bug in the AUTOINC init code.
 
318
INSERT INTO t1 VALUES(NULL);
 
319
INSERT INTO t1 VALUES (18446744073709551603); -- 2^64 - 13
 
320
SELECT * FROM t1;
 
321
SET @@SESSION.AUTO_INCREMENT_INCREMENT=5, @@SESSION.AUTO_INCREMENT_OFFSET=7;
 
322
SHOW VARIABLES LIKE "%auto_inc%";
 
323
# This should fail because of overflow but it doesn't. It fails with
 
324
# a duplicate entry message because of a MySQL server bug, it wraps
 
325
# around.  See MySQL Bug# 39828, once MySQL fix the bug we can replace
 
326
# the ER_DUP_ENTRY, 1062 below with the appropriate error message
 
327
-- error ER_DUP_ENTRY,1062
 
328
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
 
329
SELECT * FROM t1;
 
330
DROP TABLE t1;
 
331
 
 
332
# Check for overflow handling when increment and offset are odd numbers
 
333
# and check for large -ve numbers
 
334
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
335
SET @@INSERT_ID=1;
 
336
SHOW VARIABLES LIKE "%auto_inc%";
 
337
DROP TABLE IF EXISTS t1;
 
338
CREATE TABLE t1 (c1 BIGINT AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
339
# TODO: Fix the autoinc init code
 
340
# We have to do this because of a bug in the AUTOINC init code.
 
341
INSERT INTO t1 VALUES(NULL);
 
342
INSERT INTO t1 VALUES(-9223372036854775806); -- -2^63 + 2
 
343
INSERT INTO t1 VALUES(-9223372036854775807); -- -2^63 + 1
 
344
INSERT INTO t1 VALUES(-9223372036854775808); -- -2^63
 
345
SELECT * FROM t1;
 
346
SET @@SESSION.AUTO_INCREMENT_INCREMENT=3, @@SESSION.AUTO_INCREMENT_OFFSET=3;
 
347
SHOW VARIABLES LIKE "%auto_inc%";
 
348
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
 
349
SELECT * FROM t1;
 
350
DROP TABLE t1;
 
351
#
 
352
# Check for overflow handling when increment and offset are very
 
353
# large numbers 2^60
 
354
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
 
355
SET @@INSERT_ID=1;
 
356
SHOW VARIABLES LIKE "%auto_inc%";
 
357
DROP TABLE IF EXISTS t1;
 
358
CREATE TABLE t1 (c1 BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) ENGINE=InnoDB;
 
359
# TODO: Fix the autoinc init code
 
360
# We have to do this because of a bug in the AUTOINC init code.
 
361
INSERT INTO t1 VALUES(NULL);
 
362
INSERT INTO t1 VALUES (18446744073709551610); -- 2^64 - 2
 
363
SELECT * FROM t1;
 
364
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1152921504606846976, @@SESSION.AUTO_INCREMENT_OFFSET=1152921504606846976;
 
365
SHOW VARIABLES LIKE "%auto_inc%";
 
366
# This should fail because of overflow but it doesn't. It wraps around
 
367
# and the autoinc values look bogus too.
 
368
# See MySQL Bug# 39828, once MySQL fix the bug we can enable the error
 
369
# code expected test.
 
370
# -- error ER_AUTOINC_READ_FAILED,1467
 
371
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
 
372
SELECT * FROM t1;
 
373
DROP TABLE t1;