summaryrefslogtreecommitdiff
path: root/mysql-test/suite/versioning/t/alter.test
blob: a75fc926a1dbcfefe88315319e3762e9c5aa3907 (plain)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
select @@system_versioning_alter_history;

create table t(
  a int
);
show create table t;
--error ER_VERS_NOT_VERSIONED
alter table t drop system versioning;

alter table t add system versioning;
show create table t;

--error ER_VERS_ALTER_NOT_ALLOWED
alter table t add column y int;
--error ER_VERS_ALTER_ENGINE_PROHIBITED
alter table t engine innodb;

alter table t drop system versioning;
show create table t;

set system_versioning_alter_history= keep;

--error ER_VERS_FIELD_WRONG_TYPE
alter table t
  add column trx_start bigint(20) unsigned generated always as row start,
  add column trx_end bigint(20) unsigned generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;

--error ER_VERS_FIELD_WRONG_TYPE
alter table t
  add column trx_start timestamp generated always as row start,
  add column trx_end timestamp generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;

--error ER_PARSE_ERROR
alter table t
  add column trx_start timestamp(6) not null generated always as row start,
  add column trx_end timestamp(6) not null generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;

alter table t
  add column trx_start timestamp(6) generated always as row start,
  add column trx_end timestamp(6) generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;
show create table t;

alter table t drop column trx_start, drop column trx_end;
alter table t drop system versioning;
show create table t;

alter table t add system versioning;
show create table t;

alter table t add column b int;
show create table t;

alter table t add column c int;
show create table t;

alter table t add column d int first;
show create table t;

alter table t add column e int after d;
show create table t;

alter table t drop column a;
show create table t;

create or replace table t (
  a int,
  sys_trx_start timestamp(6) generated always as row start,
  sys_trx_end timestamp(6) generated always as row end,
  period for system_time(sys_trx_start, sys_trx_end))
with system versioning;

select * from t for system_time all;
alter table t drop column sys_trx_start;
alter table t drop column sys_trx_end;
select * from t for system_time all;

--error ER_CANT_DROP_FIELD_OR_KEY
alter table t drop column sys_trx_start;
--error ER_CANT_DROP_FIELD_OR_KEY
alter table t drop column sys_trx_end;

create or replace table t (
  a int,
  sys_trx_start timestamp(6) generated always as row start,
  sys_trx_end timestamp(6) generated always as row end,
  period for system_time(sys_trx_start, sys_trx_end))
with system versioning;

select * from t for system_time all;
alter table t drop column sys_trx_start, drop column sys_trx_end;
select * from t for system_time all;

create or replace table t(
  a int
);
insert into t values(1);
alter table t add system versioning;
show create table t;
insert into t values(2);
select * from t for system_time all;
select * from t;

update t set a=3 where a=1;
select * from t;
select * from t for system_time all;
select sys_trx_start from t where a=3 into @tm;
alter table t add column b int;
select @tm=sys_trx_start from t where a=3;
show create table t;
select * from t;
select * from t for system_time all;

alter table t drop system versioning;
select * from t;
show create table t;

--error ER_VERS_NOT_VERSIONED
alter table t modify a int with system versioning;
--error ER_VERS_NOT_VERSIONED
alter table t modify a int without system versioning;

alter table t add system versioning;

alter table t modify a int without system versioning;
show create table t;

alter table t modify a int with system versioning;
show create table t;

-- source suite/versioning/common.inc
create or replace table t(
  a int
) engine=innodb;

insert into t values(1);
select * from t;

--error ER_VERS_FIELD_WRONG_TYPE
alter table t
  add column trx_start timestamp(6) generated always as row start,
  add column trx_end timestamp(6) generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;

call verify_vtq;
alter table t
  add column trx_start bigint(20) unsigned generated always as row start,
  add column trx_end bigint(20) unsigned generated always as row end,
  add period for system_time(trx_start, trx_end),
  add system versioning;
call verify_vtq;

show create table t;
alter table t drop column trx_start, drop column trx_end;

call verify_vtq;
alter table t drop system versioning, algorithm=copy;
call verify_vtq;
alter table t add system versioning, algorithm=copy;
call verify_vtq;
show create table t;

update t set a= 2;
select * from t for system_time all;
call verify_vtq;

alter table t add column b int, algorithm=copy;
show create table t;
select * from t;
call verify_vtq;

alter table t drop column b, algorithm=copy;
show create table t;
select * from t for system_time all;
call verify_vtq;

alter table t drop system versioning, algorithm=inplace;
call verify_vtq;
alter table t add system versioning, algorithm=inplace;
call verify_vtq;
show create table t;

update t set a= 1;
select * from t for system_time all;
call verify_vtq;

alter table t add column b int, algorithm=inplace;
show create table t;
select * from t;
call verify_vtq;

alter table t drop column b, algorithm=inplace;
show create table t;
select * from t for system_time all;

alter table t drop system versioning, algorithm=copy;
show create table t;
call verify_vtq;

# nullable autoinc test w/o versioning
create or replace table t (a int);
insert t values (1),(2),(3),(4);
alter table t add b int auto_increment null unique;
select * from t;
drop table t;

create or replace table t (a int) with system versioning engine=innodb;
insert into t values (1), (2), (3);
delete from t where a<3;
call verify_vtq;
--replace_regex /'0-[- 0-9.:]+'/'...'/
--error ER_DUP_ENTRY
alter table t add b int not null unique;
--error ER_UNSUPPORTED_EXTENSION
alter table t add b int auto_increment unique;
alter table t add b int auto_increment null unique;
call verify_vtq;
select * from t;
select * from t for system_time all;
insert into t values (4, 0);
select * from t for system_time all;
call verify_vtq;

create or replace table t (a int) with system versioning;
insert into t values (1), (2), (3);
delete from t where a<3;
--replace_regex /'0-[- 0-9.:]+'/'...'/
--error ER_DUP_ENTRY
alter table t add b int not null unique;
--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
--error ER_UNSUPPORTED_EXTENSION
alter table t add b int auto_increment unique;
alter table t add b int auto_increment null unique;
select * from t;
select * from t for system_time all;
insert into t values (4, 0);
select * from t for system_time all;

create or replace table t (
  a int,
  sys_trx_start bigint(20) unsigned generated always as row start,
  sys_trx_end bigint(20) unsigned generated always as row end,
  period for system_time(sys_trx_start, sys_trx_end)
) with system versioning engine innodb;
--error ER_VERS_ALTER_SYSTEM_FIELD
alter table t change column sys_trx_start asdf bigint unsigned;

create or replace table t (
  a int,
  sys_trx_start timestamp(6) generated always as row start,
  sys_trx_end timestamp(6) generated always as row end,
  period for system_time(sys_trx_start, sys_trx_end)
) with system versioning engine myisam;
--error ER_VERS_ALTER_SYSTEM_FIELD
alter table t change column sys_trx_start asdf timestamp(6);

create or replace table t (
  a int,
  sys_trx_start timestamp(6) generated always as row start,
  sys_trx_end timestamp(6) generated always as row end,
  period for system_time(sys_trx_start, sys_trx_end)
) with system versioning;
select * from t;

--error ER_VERS_SYS_FIELD_NOT_HIDDEN
alter table t drop system versioning;
alter table t drop column sys_trx_start;
select * from t;

--error ER_VERS_SYS_FIELD_NOT_HIDDEN
alter table t drop system versioning;
alter table t drop column sys_trx_end;
select * from t;

alter table t drop system versioning;
show create table t;


## These experimental options are now disabled

--error ER_WRONG_VALUE_FOR_VAR
set system_versioning_alter_history= SURVIVE;

--error ER_WRONG_VALUE_FOR_VAR
set system_versioning_alter_history= DROP;

if (0)
{
create or replace table t (a int) with system versioning engine innodb;
insert into t values (1);
update t set a = 2;
select * from t for system_time all;
alter table t add column b int;
select * from t for system_time all;

create or replace table t (a int) with system versioning engine myisam;
insert into t values (1);
update t set a = 2;
select * from t for system_time all;
alter table t add column b int;
select * from t for system_time all;

create or replace table non_empty (
  a int,
  sys_trx_start bigint(20) unsigned,
  sys_trx_end bigint(20) unsigned
) engine innodb;
insert into non_empty values (1, 100, 200);

--error ER_VERS_GENERATED_ALWAYS_NOT_EMPTY
alter table non_empty
  change column sys_trx_start sys_trx_start bigint(20) unsigned generated always as row start;
--error ER_VERS_GENERATED_ALWAYS_NOT_EMPTY
alter table non_empty
  change column sys_trx_end sys_trx_end bigint(20) unsigned generated always as row end;
drop table non_empty;

create or replace table t (a int primary key) with system versioning;
insert into t values (1);
update t set a=2;
alter table t drop primary key, add primary key (a), drop system versioning;
select * from t;
--replace_result InnoDB INNODB_OR_MYISAM MyISAM INNODB_OR_MYISAM
show create table t;

create or replace table t (a int primary key) with system versioning;
insert into t values (1);
update t set a=2;
alter table t drop system versioning;
select * from t;
--replace_result InnoDB INNODB_OR_MYISAM MyISAM INNODB_OR_MYISAM
show create table t;


call verify_vtq;
}

create or replace table t (a int) with system versioning;
--error ER_VERS_ALREADY_VERSIONED
alter table t add system versioning;
--error ER_VERS_ALREADY_VERSIONED
alter table t add system versioning, drop system versioning;

drop database test;
create database test;