1set default_storage_engine=innodb;
2#
3# Bug#22469130: FOREIGN KEY ON DELETE CASCADE NOT ALLOWED
4#               WHEN A VIRTUAL INDEX EXISTS.
5# UPDATE CASCADE
6CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
7CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
8FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
9INSERT INTO t1 VALUES(1);
10INSERT INTO t2 VALUES(1, DEFAULT);
11UPDATE t1 SET fld1= 2;
12SELECT fld2 FROM t2;
13fld2
142
15SELECT * FROM t2;
16fld1	fld2
172	2
18DROP TABLE t2, t1;
19# UPDATE SET NULL
20CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY,
21KEY(fld1));
22CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
23FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE SET NULL);
24INSERT INTO t1 VALUES(1, 2);
25INSERT INTO t2 VALUES(1, DEFAULT);
26UPDATE t1 SET fld1= 2;
27SELECT fld2 FROM t2;
28fld2
29NULL
30SELECT * FROM t2;
31fld1	fld2
32NULL	NULL
33DROP TABLE t2, t1;
34# DELETE CASCADE
35CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
36CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
37FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
38INSERT INTO t1 VALUES(1);
39INSERT INTO t1 VALUES(2);
40INSERT INTO t2 VALUES(1, DEFAULT);
41INSERT INTO t2 VALUES(2, DEFAULT);
42DELETE FROM t1 WHERE fld1= 1;
43SELECT fld2 FROM t2;
44fld2
452
46SELECT * FROM t2;
47fld1	fld2
482	2
49DROP TABLE t2, t1;
50# DELETE SET NULL
51CREATE TABLE t1(fld1 INT NOT NULL, fld2 INT NOT NULL PRIMARY KEY, KEY(fld1));
52CREATE TABLE t2(fld1 INT, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
53FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE SET NULL);
54INSERT INTO t1 VALUES(1, 1);
55INSERT INTO t1 VALUES(2, 2);
56INSERT INTO t2 VALUES(1, DEFAULT);
57INSERT INTO t2 VALUES(2, DEFAULT);
58DELETE FROM t1 WHERE fld1= 1;
59SELECT fld2 FROM t2;
60fld2
61NULL
622
63SELECT * FROM t2;
64fld1	fld2
65NULL	NULL
662	2
67DROP TABLE t2, t1;
68# VIRTUAL INDEX CONTAINS FK CONSTRAINT COLUMN
69CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
70CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT, fld3 INT AS (fld2) VIRTUAL,
71KEY(fld3, fld1),
72FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
73INSERT INTO t1(fld1) VALUES(1);
74INSERT INTO t2(fld1, fld2) VALUES(1, 3);
75UPDATE t1 SET fld1= 2;
76SELECT fld3, fld1 FROM t2;
77fld3	fld1
783	2
79SELECT * FROM t2;
80fld1	fld2	fld3
812	3	3
82DROP TABLE t2, t1;
83# Multiple level of VIRTUAL columns.
84CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
85CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
86fld3 INT AS (fld2) VIRTUAL, KEY(fld3), KEY(fld2),
87FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
88INSERT INTO t1(fld1) VALUES(1);
89INSERT INTO t2(fld1) VALUES(1);
90UPDATE t1 SET fld1= 2;
91SELECT fld2 FROM t2;
92fld2
932
94SELECT fld3 FROM t2;
95fld3
962
97SELECT * FROM t2;
98fld1	fld2	fld3
992	2	2
100DROP TABLE t2, t1;
101# Drop the VIRTUAL INDEX using alter copy ALGORITHM
102CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
103CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY vk(fld2),
104KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
105ON UPDATE CASCADE);
106INSERT INTO t1(fld1) VALUES(1);
107INSERT INTO t2(fld1) VALUES(1);
108UPDATE t1 SET fld1= 2;
109SELECT fld2, fld1 FROM t2;
110fld2	fld1
1112	2
112ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
113UPDATE t1 SET fld1= 3;
114SELECT fld2, fld1 FROM t2;
115fld2	fld1
1163	3
117DROP TABLE t2, t1;
118# Drop the VIRTUAL INDEX using INPLACE alter ALGORITHM
119CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
120CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
121KEY vk(fld2), KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
122ON UPDATE CASCADE);
123INSERT INTO t1(fld1) VALUES(1);
124INSERT INTO t2(fld1) VALUES(1);
125UPDATE t1 SET fld1= 2;
126SELECT fld2, fld1 FROM t2;
127fld2	fld1
1282	2
129ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
130UPDATE t1 SET fld1= 3;
131SELECT fld2, fld1 FROM t2;
132fld2	fld1
1333	3
134DROP TABLE t2, t1;
135# Add the VIRTUAL INDEX using COPY alter ALGORITHM
136CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
137CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
138KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
139ON UPDATE CASCADE);
140INSERT INTO t1(fld1) VALUES(1);
141INSERT INTO t2(fld1) VALUES(1);
142UPDATE t1 SET fld1= 2;
143SELECT fld2, fld1 FROM t2;
144fld2	fld1
1452	2
146ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= COPY;
147UPDATE t1 SET fld1= 3;
148SELECT fld2, fld1 FROM t2;
149fld2	fld1
1503	3
151DROP TABLE t2, t1;
152# Add the VIRTUAL INDEX using INPLACE alter ALGORITHM
153CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
154CREATE TABLE t2(fld1 INT NOT NULL,fld2 INT AS (fld1) VIRTUAL,
155KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
156ON UPDATE CASCADE);
157INSERT INTO t1(fld1) VALUES(1);
158INSERT INTO t2(fld1) VALUES(1);
159UPDATE t1 SET fld1= 2;
160SELECT fld2, fld1 FROM t2;
161fld2	fld1
1622	2
163ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM= INPLACE;
164UPDATE t1 SET fld1= 3;
165SELECT fld2, fld1 FROM t2;
166fld2	fld1
1673	3
168DROP TABLE t2, t1;
169# Drop the VIRTUAL INDEX contains fk constraint column
170# using alter copy ALGORITHM
171CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
172CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
173fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
174KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
175ON UPDATE CASCADE);
176INSERT INTO t1(fld1) VALUES(1);
177INSERT INTO t2(fld1, fld2) VALUES(1, 2);
178UPDATE t1 SET fld1= 2;
179SELECT fld3, fld1 FROM t2;
180fld3	fld1
1812	2
182ALTER TABLE t2 DROP INDEX vk, ALGORITHM= COPY;
183UPDATE t1 SET fld1= 3;
184SELECT fld3, fld1 FROM t2;
185fld3	fld1
1862	3
187DROP TABLE t2, t1;
188# Drop the VIRTUAL INDEX which contains fk constraint column
189# using INPLACE alter operation
190CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
191CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
192fld3 INT AS (fld2) VIRTUAL, KEY vk(fld3, fld1),
193KEY(fld1), FOREIGN KEY(fld1) REFERENCES t1(fld1)
194ON UPDATE CASCADE);
195INSERT INTO t1(fld1) VALUES(1);
196INSERT INTO t2(fld1, fld2) VALUES(1, 2);
197UPDATE t1 SET fld1= 2;
198SELECT fld3, fld1 FROM t2;
199fld3	fld1
2002	2
201alter TABLE t2 DROP INDEX vk, ALGORITHM= INPLACE;
202UPDATE t1 SET fld1= 3;
203SELECT fld3, fld1 FROM t2;
204fld3	fld1
2052	3
206DROP TABLE t2, t1;
207# Add the VIRTUAL INDEX contains fk constraint column
208# using copy alter operatiON
209CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
210CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
211fld3 INT AS (fld2) VIRTUAL, KEY(fld1),
212FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
213INSERT INTO t1(fld1) VALUES(1);
214INSERT INTO t2(fld1, fld2) VALUES(1, 2);
215UPDATE t1 SET fld1= 2;
216SELECT fld3, fld1 FROM t2;
217fld3	fld1
2182	2
219alter TABLE t2 ADD INDEX vk(fld3, fld1), ALGORITHM= COPY;
220UPDATE t1 SET fld1= 3;
221SELECT fld3, fld1 FROM t2;
222fld3	fld1
2232	3
224DROP TABLE t2, t1;
225# Cascading UPDATEs and DELETEs for the multiple
226# fk dependent TABLEs
227CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
228CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
229KEY(fld1), KEY(fld2, fld1),
230FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
231CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
232KEY(fld2, fld1),
233FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
234INSERT INTO t1 VALUES(1), (2);
235INSERT INTO t2(fld1) VALUES(1), (2);
236INSERT INTO t3(fld1) VALUES(1), (2);
237UPDATE t1 SET fld1= 4 WHERE fld1= 1;
238SELECT fld2, fld1 FROM t2;
239fld2	fld1
2402	2
2414	4
242SELECT fld2, fld1 FROM t3;
243fld2	fld1
2442	2
2454	4
246DROP TABLE t3, t2, t1;
247CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
248CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
249fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1), KEY(fld1),
250FOREIGN KEY(fld1) REFERENCES t1(fld1) ON UPDATE CASCADE);
251CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
252fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
253FOREIGN KEY(fld1) REFERENCES t2(fld1) ON UPDATE CASCADE);
254INSERT INTO t1 VALUES(1), (2);
255INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
256INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
257UPDATE t1 SET fld1= 4 WHERE fld1= 1;
258SELECT fld3, fld1 FROM t2;
259fld3	fld1
2601	4
2612	2
262SELECT fld3, fld1 FROM t3;
263fld3	fld1
2641	4
2652	2
266DROP TABLE t3, t2, t1;
267CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
268CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
269KEY(fld1), KEY(fld2, fld1),
270FOREIGN KEY(fld1) REFERENCES t1(fld1) ON DELETE CASCADE);
271CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL,
272KEY(fld2, fld1), FOREIGN KEY(fld1) REFERENCES t2(fld1)
273ON DELETE CASCADE);
274INSERT INTO t1 VALUES(1), (2);
275INSERT INTO t2(fld1) VALUES(1), (2);
276INSERT INTO t3(fld1) VALUES(1), (2);
277DELETE FROM t1 WHERE fld1= 1;
278SELECT fld2, fld1 FROM t2;
279fld2	fld1
2802	2
281SELECT fld2, fld1 FROM t3;
282fld2	fld1
2832	2
284DROP TABLE t3, t2, t1;
285CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
286CREATE TABLE t2(fld1 INT NOT NULL, fld2 INT NOT NULL,
287fld3 INT AS (fld2) VIRTUAL,
288KEY(fld3, fld1), KEY(fld1),
289FOREIGN KEY(fld1) REFERENCES t1(fld1)
290ON DELETE CASCADE);
291CREATE TABLE t3(fld1 INT NOT NULL, fld2 INT NOT NULL,
292fld3 INT AS (fld2) VIRTUAL, KEY(fld3, fld1),
293FOREIGN KEY(fld1) REFERENCES t2(fld1)
294ON DELETE CASCADE);
295INSERT INTO t1 VALUES(1), (2);
296INSERT INTO t2 VALUES(1, 1, DEFAULT), (2, 2, default);
297INSERT INTO t3 VALUES(1, 1, DEFAULT), (2, 2, default);
298DELETE FROM t1 WHERE fld1= 1;
299SELECT fld3, fld1 FROM t2;
300fld3	fld1
3012	2
302SELECT fld3, fld1 FROM t3;
303fld3	fld1
3042	2
305DROP TABLE t3, t2, t1;
306# RENAME TABLE
307CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
308CREATE TABLE t2(fld1 INT NOT NULL,
309fld2 INT AS (fld1) VIRTUAL,
310KEY(fld2, fld1),
311FOREIGN KEY(fld1) REFERENCES t1(fld1)
312ON DELETE CASCADE);
313INSERT INTO t1 VALUES(1), (2);
314INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
315RENAME TABLE t2 to t3;
316DELETE FROM t1 WHERE fld1= 1;
317SELECT fld2, fld1 FROM t3;
318fld2	fld1
3192	2
320DROP TABLE t3, t1;
321# FOREIGN_KEY_CHECKS disabled DURING INPLACE ALTER
322CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
323CREATE TABLE t2(fld1 INT NOT NULL,
324fld2 INT AS (fld1) VIRTUAL,
325FOREIGN KEY(fld1) REFERENCES t1(fld1)
326ON UPDATE CASCADE);
327INSERT INTO t1 VALUES(1), (2);
328INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
329SET foreign_key_checks = 0;
330ALTER TABLE t2 ADD INDEX vk(fld2), ALGORITHM=INPLACE;
331SET foreign_key_checks = 1;
332UPDATE t1 SET fld1= 3 WHERE fld1= 2;
333SELECT fld2 FROM t2;
334fld2
3351
3363
337DROP TABLE t2, t1;
338# GENERATED COLUMN COMPUTATION FAILS when SQL_MODE
339# is set to ERROR_FOR_DIVISION_BY_ZERO
340CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
341CREATE TABLE t2(fld1 INT NOT NULL,
342fld2 INT AS (100/fld1) VIRTUAL,
343KEY(fld2),
344FOREIGN KEY(fld1) REFERENCES t1(fld1)
345ON UPDATE CASCADE);
346INSERT INTO t1 VALUES(1), (2);
347INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
348UPDATE IGNORE t1 SET fld1= 0 WHERE fld1= 2;
349Warnings:
350Warning	1365	Division by 0
351SELECT fld2 FROM t2;
352fld2
353NULL
354100
355DROP TABLE t2, t1;
356# CHANGE SQL_MODE and try the ERROR_FOR_DIVISION_BY_ZERO
357SET sql_mode = STRICT_ALL_TABLES;
358CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
359CREATE TABLE t2(fld1 INT NOT NULL,
360fld2 INT AS (100/fld1) VIRTUAL,
361KEY(fld2),
362FOREIGN KEY(fld1) REFERENCES t1(fld1)
363ON UPDATE CASCADE);
364INSERT INTO t1 VALUES(1), (2);
365INSERT INTO t2 VALUES(1, DEFAULT), (2, default);
366UPDATE t1 SET fld1= 0 WHERE fld1= 2;
367SELECT fld2 FROM t2;
368fld2
369NULL
370100
371SELECT * FROM t2;
372fld1	fld2
3731	100
3740	NULL
375DROP TABLE t2, t1;
376SET sql_mode = default;
377# ADD FOREIGN CONSTRAINT USING COPY
378CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
379CREATE TABLE t2(fld1 INT NOT NULL,
380fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
381ALTER TABLE t2 ADD FOREIGN KEY (fld1)
382REFERENCES t1(fld1) ON UPDATE CASCADE,
383ALGORITHM=copy;
384INSERT INTO t1 VALUES(1);
385INSERT INTO t2 VALUES(1, DEFAULT);
386UPDATE t1 SET fld1= 2;
387SELECT fld2 FROM t2;
388fld2
3892
390SELECT * FROM t2;
391fld1	fld2
3922	2
393DROP TABLE t2, t1;
394# ADD FOREIGN CONSTRAINT USING INPLACE
395CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
396CREATE TABLE t2(fld1 INT NOT NULL,
397fld2 INT AS (fld1) VIRTUAL, KEY(fld2));
398SET foreign_key_checks = 0;
399ALTER TABLE t2 ADD FOREIGN KEY (fld1)
400REFERENCES t1(fld1) ON UPDATE CASCADE,
401ALGORITHM=inplace;
402SET foreign_key_checks = 1;
403INSERT INTO t1 VALUES(1);
404INSERT INTO t2 VALUES(1, DEFAULT);
405UPDATE t1 SET fld1= 2;
406SELECT fld2 FROM t2;
407fld2
4082
409SELECT * FROM t2;
410fld1	fld2
4112	2
412DROP TABLE t2, t1;
413# DROP FOREIGN CONSTRAINT USING COPY
414CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
415CREATE TABLE t2(fld1 INT NOT NULL,
416fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
417CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
418ON UPDATE CASCADE);
419INSERT INTO t1 VALUES(1);
420INSERT INTO t2 VALUES(1, DEFAULT);
421ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=COPY;
422UPDATE t1 SET fld1= 2;
423SELECT fld2 FROM t2;
424fld2
4251
426SELECT * FROM t2;
427fld1	fld2
4281	1
429DROP TABLE t2, t1;
430# DROP FOREIGN CONSTRAINT USING INPLACE
431CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
432CREATE TABLE t2(fld1 INT NOT NULL,
433fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
434CONSTRAINT fidx FOREIGN KEY (fld1) REFERENCES t1(fld1)
435ON UPDATE CASCADE);
436SET foreign_key_checks = 0;
437ALTER TABLE t2 DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
438SET foreign_key_checks = 1;
439INSERT INTO t1 VALUES(1);
440INSERT INTO t2 VALUES(1, DEFAULT);
441UPDATE t1 SET fld1= 2;
442SELECT fld2 FROM t2;
443fld2
4441
445SELECT * FROM t2;
446fld1	fld2
4471	1
448DROP TABLE t2, t1;
449# ADD VC INDEX and ADD FK IN SAME COPY ALTER
450CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
451CREATE TABLE t2(fld1 INT NOT NULL,
452fld2 INT AS (fld1) VIRTUAL);
453INSERT INTO t1 VALUES(1);
454INSERT INTO t2 VALUES(1, DEFAULT);
455ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
456ON UPDATE CASCADE, ALGORITHM=copy;
457UPDATE t1 SET fld1= 2;
458SELECT fld2 FROM t2;
459fld2
4602
461SELECT * FROM t2;
462fld1	fld2
4632	2
464DROP TABLE t2, t1;
465# ADD VC INDEX and ADD FK IN SAME INPLACE ALTER
466CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
467CREATE TABLE t2(fld1 INT NOT NULL,
468fld2 INT AS (fld1) VIRTUAL);
469INSERT INTO t1 VALUES(1);
470INSERT INTO t2 VALUES(1, DEFAULT);
471SET foreign_key_checks = 0;
472ALTER TABLE t2 ADD INDEX(fld2), ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
473ON UPDATE CASCADE, ALGORITHM=inplace;
474SET foreign_key_checks = 1;
475UPDATE t1 SET fld1= 2;
476SELECT fld2 FROM t2;
477fld2
4782
479SELECT * FROM t2;
480fld1	fld2
4812	2
482DROP TABLE t2, t1;
483# ADD VC INDEX and DROP FK IN SAME COPY ALTER
484CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
485CREATE TABLE t2(fld1 INT NOT NULL,
486fld2 INT AS (fld1) VIRTUAL,
487CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
488ON UPDATE CASCADE);
489INSERT INTO t1 VALUES(1);
490INSERT INTO t2 VALUES(1, DEFAULT);
491ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=copy;
492UPDATE t1 SET fld1= 2;
493SELECT fld2 FROM t2;
494fld2
4951
496SELECT * FROM t2;
497fld1	fld2
4981	1
499DROP TABLE t2, t1;
500# ADD VC INDEX and DROP FK IN SAME INPLACE ALTER
501CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
502CREATE TABLE t2(fld1 INT NOT NULL,
503fld2 INT AS (fld1) VIRTUAL,
504CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
505ON UPDATE CASCADE);
506INSERT INTO t1 VALUES(1);
507INSERT INTO t2 VALUES(1, DEFAULT);
508SET foreign_key_checks = 0;
509ALTER TABLE t2 ADD INDEX(fld2), DROP FOREIGN KEY fidx, ALGORITHM=inplace;
510SET foreign_key_checks = 1;
511UPDATE t1 SET fld1= 2;
512SELECT fld2 FROM t2;
513fld2
5141
515SELECT * FROM t2;
516fld1	fld2
5171	1
518DROP TABLE t2, t1;
519# DROP VC INDEX and ADD FK IN SAME COPY ALTER
520CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
521CREATE TABLE t2(fld1 INT NOT NULL,
522fld2 INT AS (fld1) VIRTUAL,
523KEY idx(fld2));
524INSERT INTO t1 VALUES(1);
525INSERT INTO t2 VALUES(1, DEFAULT);
526ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
527ON UPDATE CASCADE, ALGORITHM=COPY;
528UPDATE t1 SET fld1= 2;
529SELECT fld2 FROM t2;
530fld2
5312
532SELECT * FROM t2;
533fld1	fld2
5342	2
535DROP TABLE t2, t1;
536# DROP VC INDEX and ADD FK IN SAME INPLACE ALTER
537CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
538CREATE TABLE t2(fld1 INT NOT NULL,
539fld2 INT AS (fld1) VIRTUAL,
540KEY idx(fld2));
541INSERT INTO t1 VALUES(1);
542INSERT INTO t2 VALUES(1, DEFAULT);
543SET foreign_key_checks = 0;
544ALTER TABLE t2 DROP INDEX idx, ADD FOREIGN KEY (fld1) REFERENCES t1(fld1)
545ON UPDATE CASCADE, ALGORITHM=INPLACE;
546SET foreign_key_checks = 1;
547UPDATE t1 SET fld1= 2;
548SELECT fld2 FROM t2;
549fld2
5502
551SELECT * FROM t2;
552fld1	fld2
5532	2
554DROP TABLE t2, t1;
555# DROP VC INDEX and DROP FK IN SAME COPY ALTER
556CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
557CREATE TABLE t2(fld1 INT NOT NULL,
558fld2 INT AS (fld1) VIRTUAL,
559KEY idx(fld2),
560CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
561ON UPDATE CASCADE);
562INSERT INTO t1 VALUES(1);
563INSERT INTO t2 VALUES(1, DEFAULT);
564ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=COPY;
565UPDATE t1 SET fld1= 2;
566SELECT fld2 FROM t2;
567fld2
5681
569SELECT * FROM t2;
570fld1	fld2
5711	1
572DROP TABLE t2, t1;
573# DROP VC INDEX and DROP FK IN SAME INPLACE ALTER
574CREATE TABLE t1(fld1 INT NOT NULL PRIMARY KEY);
575CREATE TABLE t2(fld1 INT NOT NULL,
576fld2 INT AS (fld1) VIRTUAL,
577KEY idx(fld2),
578CONSTRAINT fidx FOREIGN KEY(fld1) REFERENCES t1(fld1)
579ON UPDATE CASCADE);
580INSERT INTO t1 VALUES(1);
581INSERT INTO t2 VALUES(1, DEFAULT);
582SET foreign_key_checks = 0;
583ALTER TABLE t2 DROP KEY idx, DROP FOREIGN KEY fidx, ALGORITHM=INPLACE;
584SET foreign_key_checks = 1;
585UPDATE t1 SET fld1= 2;
586SELECT fld2 FROM t2;
587fld2
5881
589SELECT * FROM t2;
590fld1	fld2
5911	1
592DROP TABLE t2, t1;
593CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
594CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
595KEY (f1, f2), FOREIGN KEY(f1) REFERENCES t1(f1))ENGINE=INNODB;
596INSERT INTO t1 VALUES(1);
597INSERT INTO t2(f1) VALUES(1);
598EXPLAIN SELECT f1, f2 FROM t2;
599id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6001	SIMPLE	t2	index	NULL	f1	9	NULL	1	Using index
601SELECT f1, f2 FROM t2;
602f1	f2
6031	1
604INSERT INTO t2(f1) VALUES(2);
605ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`))
606DROP TABLE t2, t1;
607CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
608CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
609KEY (f1, f2), FOREIGN KEY(f1) REFERENCES t1(f1)
610ON UPDATE CASCADE)ENGINE=INNODB;
611INSERT INTO t1 VALUES(1);
612INSERT INTO t2(f1) VALUES(1);
613EXPLAIN SELECT f1, f2 FROM t2;
614id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6151	SIMPLE	t2	index	NULL	f1	9	NULL	1	Using index
616SELECT f1, f2 FROM t2;
617f1	f2
6181	1
619UPDATE t1 SET f1 = 2 WHERE f1 = 1;
620EXPLAIN SELECT f1, f2 FROM t2;
621id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6221	SIMPLE	t2	index	NULL	f1	9	NULL	1	Using index
623SELECT f1, f2 FROM t2;
624f1	f2
6252	2
626DROP TABLE t2, t1;
627CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
628CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
629KEY (f1, f2))ENGINE=INNODB;
630INSERT INTO t1 VALUES(1);
631INSERT INTO t2(f1) VALUES(1);
632SET FOREIGN_KEY_CHECKS = 0;
633ALTER TABLE t2 ADD FOREIGN KEY (f1) REFERENCES t1(f1)
634ON UPDATE CASCADE, ALGORITHM=INPLACE;
635SET FOREIGN_KEY_CHECKS = 1;
636UPDATE t1 SET f1 = 3;
637EXPLAIN SELECT f1, f2 FROM t2;
638id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6391	SIMPLE	t2	index	NULL	f1	9	NULL	1	Using index
640SELECT f1, f2 FROM t2;
641f1	f2
6423	3
643DROP TABLE t2, t1;
644CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY)ENGINE=INNODB;
645CREATE TABLE t2 (f1 INT NOT NULL, f2 INT AS (f1) VIRTUAL,
646KEY (f1, f2))ENGINE=INNODB;
647INSERT INTO t1 VALUES(1);
648INSERT INTO t2(f1) VALUES(1);
649ALTER TABLE t2 ADD FOREIGN KEY (f1) REFERENCES t1(f1)
650ON UPDATE CASCADE, ALGORITHM=COPY;
651UPDATE t1 SET f1 = 3;
652EXPLAIN SELECT f1, f2 FROM t2;
653id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6541	SIMPLE	t2	index	NULL	f1	9	NULL	1	Using index
655SELECT f1, f2 FROM t2;
656f1	f2
6573	3
658DROP TABLE t2, t1;
659CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
660CREATE TABLE t2(f1 INT NOT NULL, f2 INT AS (1) VIRTUAL,
661f3 INT AS (2) VIRTUAL,
662FOREIGN KEY idx (f1) REFERENCES t1(f1) ON UPDATE CASCADE,
663KEY idx1 (f2, f1, f3))ENGINE=INNODB;
664INSERT INTO t1 VALUES(1);
665INSERT INTO t2(f1) VALUES(1);
666ALTER TABLE t2 DROP COLUMN f2, ALGORITHM=INPLACE;
667UPDATE t1 SET f1 = 3;
668EXPLAIN SELECT f1, f3 FROM t2;
669id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6701	SIMPLE	t2	index	NULL	idx1	9	NULL	1	Using index
671SELECT f1, f3 FROM t2;
672f1	f3
6733	2
674DROP TABLE t2, t1;
675CREATE TABLE t1(f1 INT NOT NULL, PRIMARY KEY(f1))ENGINE=INNODB;
676CREATE TABLE t2(f1 INT NOT NULL, f2 INT AS (1) VIRTUAL,
677f3 INT AS (2) VIRTUAL,
678FOREIGN KEY idx (f1) REFERENCES t1(f1) ON UPDATE CASCADE,
679KEY idx1 (f2, f1, f3))ENGINE=INNODB;
680INSERT INTO t1 VALUES(1);
681INSERT INTO t2(f1) VALUES(1);
682ALTER TABLE t2 DROP COLUMN f2, ALGORITHM=COPY;
683UPDATE t1 SET f1 = 3;
684EXPLAIN SELECT f1, f3 FROM t2;
685id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
6861	SIMPLE	t2	index	NULL	idx1	9	NULL	1	Using index
687SELECT f1, f3 FROM t2;
688f1	f3
6893	2
690DROP TABLE t2, t1;
691#
692# MDEV-15553 Assertion failed in dict_table_get_col_name
693#
694CREATE TABLE t1 (
695c1 TIMESTAMP,
696c2 YEAR,
697c3 TIME,
698c4 CHAR(10),
699v1 TIMESTAMP AS (c1) VIRTUAL,
700v2 YEAR AS (c2) VIRTUAL,
701v3 TIME AS (c3) VIRTUAL,
702v4 CHAR(10) AS (c4) VIRTUAL
703) ENGINE=InnoDB;
704ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
705ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
706SET foreign_key_checks=0;
707ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
708ERROR HY000: Failed to add the foreign key constaint. Missing index for constraint 'fk' in the foreign table 't1'
709ALTER TABLE t1 ADD INDEX(v4);
710ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
711SET foreign_key_checks=1;
712SHOW CREATE TABLE t1;
713Table	Create Table
714t1	CREATE TABLE `t1` (
715  `c1` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
716  `c2` year(4) DEFAULT NULL,
717  `c3` time DEFAULT NULL,
718  `c4` char(10) DEFAULT NULL,
719  `v1` timestamp GENERATED ALWAYS AS (`c1`) VIRTUAL,
720  `v2` year(4) GENERATED ALWAYS AS (`c2`) VIRTUAL,
721  `v3` time GENERATED ALWAYS AS (`c3`) VIRTUAL,
722  `v4` char(10) GENERATED ALWAYS AS (`c4`) VIRTUAL,
723  KEY `v4` (`v4`),
724  CONSTRAINT `fk` FOREIGN KEY (`v4`) REFERENCES `nosuch` (`col`)
725) ENGINE=InnoDB DEFAULT CHARSET=latin1
726ALTER TABLE t1 DROP FOREIGN KEY fk;
727ALTER TABLE t1 ADD CONSTRAINT fk FOREIGN KEY (v4) REFERENCES nosuch(col);
728ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
729SHOW CREATE TABLE t1;
730Table	Create Table
731t1	CREATE TABLE `t1` (
732  `c1` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
733  `c2` year(4) DEFAULT NULL,
734  `c3` time DEFAULT NULL,
735  `c4` char(10) DEFAULT NULL,
736  `v1` timestamp GENERATED ALWAYS AS (`c1`) VIRTUAL,
737  `v2` year(4) GENERATED ALWAYS AS (`c2`) VIRTUAL,
738  `v3` time GENERATED ALWAYS AS (`c3`) VIRTUAL,
739  `v4` char(10) GENERATED ALWAYS AS (`c4`) VIRTUAL,
740  KEY `v4` (`v4`)
741) ENGINE=InnoDB DEFAULT CHARSET=latin1
742DROP TABLE t1;
743#
744# MDEV-20396 Server crashes after DELETE with SEL NULL Foreign key and a
745# virtual column in index
746#
747CREATE TABLE parent
748(
749ID int unsigned NOT NULL,
750PRIMARY KEY (ID)
751);
752CREATE TABLE child
753(
754ID int unsigned NOT NULL,
755ParentID int unsigned NULL,
756Value int unsigned NOT NULL DEFAULT 0,
757Flag int unsigned AS (Value) VIRTUAL,
758PRIMARY KEY (ID),
759KEY (ParentID, Flag),
760FOREIGN KEY (ParentID) REFERENCES parent (ID) ON DELETE SET NULL
761ON UPDATE CASCADE
762);
763INSERT INTO parent (ID) VALUES (100);
764INSERT INTO child (ID,ParentID,Value) VALUES (123123,100,1);
765DELETE FROM parent WHERE ID=100;
766select * from child;
767ID	ParentID	Value	Flag
768123123	NULL	1	1
769INSERT INTO parent (ID) VALUES (100);
770UPDATE child SET ParentID=100 WHERE ID=123123;
771DROP TABLE child, parent;
772#
773# MDEV-23387 dict_load_foreign() fails to load the table during alter
774#
775SET FOREIGN_KEY_CHECKS=0;
776CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
777f3 INT AS (f1) VIRTUAL,
778INDEX(f1), INDEX(f2))ENGINE=InnoDB;
779ALTER TABLE t1 ADD CONSTRAINT r FOREIGN KEY(f2) REFERENCES t1(f1), LOCK=NONE;
780SHOW CREATE TABLE t1;
781Table	Create Table
782t1	CREATE TABLE `t1` (
783  `f1` int(11) NOT NULL,
784  `f2` int(11) NOT NULL,
785  `f3` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL,
786  KEY `f1` (`f1`),
787  KEY `f2` (`f2`),
788  CONSTRAINT `r` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`)
789) ENGINE=InnoDB DEFAULT CHARSET=latin1
790ALTER TABLE t1 DROP INDEX f1;
791ALTER TABLE t1 DROP f3;
792DROP TABLE t1;
793#
794# MDEV-24041 Generated column DELETE with FOREIGN KEY crash InnoDB
795#
796SET FOREIGN_KEY_CHECKS=1;
797CREATE DATABASE `a-b`;
798USE `a-b`;
799CREATE TABLE emails (
800id int,
801PRIMARY KEY (id)
802) ENGINE=InnoDB;
803CREATE TABLE email_stats (
804id int,
805email_id int,
806date_sent char(4),
807generated_email_id int as (email_id),
808#generated_sent_date DATE GENERATED ALWAYS AS (date_sent),
809PRIMARY KEY (id),
810KEY mautic_generated_sent_date_email_id (generated_email_id),
811FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
812ON UPDATE CASCADE
813) ENGINE=InnoDB;
814CREATE TABLE emails_metadata (
815email_id int,
816PRIMARY KEY (email_id),
817CONSTRAINT FK FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE CASCADE
818ON UPDATE CASCADE
819) ENGINE=InnoDB;
820INSERT INTO emails VALUES (1);
821INSERT INTO email_stats (id, email_id,  date_sent) VALUES (1,1,'Jan');
822INSERT INTO emails_metadata VALUES (1);
823UPDATE emails SET id=2;
824DELETE FROM emails;
825DROP TABLE email_stats;
826DROP TABLE emails_metadata;
827DROP TABLE emails;
828DROP DATABASE `a-b`;
829USE test;
830#
831# Bug#33053297 VIRTUAL INDEX CORRUPTED DURING CASCADE UPDATE ON CHILD TABLE
832#
833# Test-Case 1
834CREATE TABLE emails (
835id int unsigned NOT NULL AUTO_INCREMENT,
836PRIMARY KEY (id)
837) ENGINE=InnoDB;
838CREATE TABLE email_stats (
839id bigint unsigned NOT NULL AUTO_INCREMENT,
840email_id int unsigned DEFAULT NULL,
841date_sent datetime NOT NULL,
842generated_sent_date date GENERATED ALWAYS AS
843(concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
844'-', lpad(dayofmonth(date_sent), 2, '0'))),
845PRIMARY KEY (id),
846KEY IDX_ES1 (email_id),
847KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
848FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
849) ENGINE = InnoDB;
850INSERT INTO emails VALUES (1);
851INSERT INTO email_stats (id, email_id, date_sent)
852VALUES (1, 1, '2020-10-22 13:32:41');
853SELECT * FROM email_stats;
854id	email_id	date_sent	generated_sent_date
8551	1	2020-10-22 13:32:41	2020-10-22
856DELETE FROM emails;
857DELETE FROM email_stats;
858# Clean up.
859DROP TABLE email_stats;
860DROP TABLE emails;
861# Test-Case 2
862CREATE TABLE emails (
863id int unsigned NOT NULL AUTO_INCREMENT,
864PRIMARY KEY (id)
865) ENGINE = InnoDB
866DEFAULT CHARSET = utf8mb4
867COLLATE = utf8mb4_unicode_ci
868ROW_FORMAT = DYNAMIC;
869CREATE TABLE email_stats (
870id bigint unsigned NOT NULL AUTO_INCREMENT,
871email_id int unsigned DEFAULT NULL,
872date_sent datetime NOT NULL,
873generated_sent_date date GENERATED ALWAYS AS
874(concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
875'-', lpad(dayofmonth(date_sent), 2, '0'))),
876PRIMARY KEY (id),
877KEY IDX_ES1 (email_id),
878KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
879FOREIGN KEY (email_id) REFERENCES emails (id)
880ON DELETE SET NULL
881ON UPDATE SET NULL
882) ENGINE = InnoDB;
883INSERT INTO emails VALUES (1);
884INSERT INTO email_stats (id, email_id, date_sent)
885VALUES (1, 1, '2020-10-22 13:32:41');
886UPDATE emails SET id = 2 where id = 1;
887SELECT id FROM email_stats WHERE generated_sent_date IS NULL;
888id
889SELECT * FROM email_stats;
890id	email_id	date_sent	generated_sent_date
8911	NULL	2020-10-22 13:32:41	2020-10-22
892UPDATE email_stats
893SET email_id=2
894WHERE DATE(generated_sent_date) = '2020-10-22';
895SELECT * FROM email_stats;
896id	email_id	date_sent	generated_sent_date
8971	2	2020-10-22 13:32:41	2020-10-22
898# Clean up.
899DROP TABLE email_stats;
900DROP TABLE emails;
901# Test-case 3
902CREATE TABLE emails (
903id int unsigned NOT NULL AUTO_INCREMENT,
904PRIMARY KEY (id)
905) ENGINE = INNODB
906DEFAULT CHARSET = utf8mb4
907COLLATE = utf8mb4_unicode_ci
908ROW_FORMAT = DYNAMIC;
909CREATE TABLE email_stats (
910id bigint unsigned NOT NULL AUTO_INCREMENT,
911email_id int unsigned DEFAULT NULL,
912date_sent datetime NOT NULL,
913generated_sent_email varchar(20) GENERATED ALWAYS AS
914(CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
915PRIMARY KEY (id),
916KEY idx_es1 (email_id),
917KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
918FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
919) ENGINE = INNODB;
920INSERT INTO emails VALUES (1);
921INSERT INTO email_stats (id, email_id, date_sent)
922VALUES (1, 1, '2020-10-22 13:32:41');
923SELECT * FROM email_stats;
924id	email_id	date_sent	generated_sent_email
9251	1	2020-10-22 13:32:41	2020-1
926SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
927date_sent
9282020-10-22 13:32:41
929DELETE FROM emails;
930SELECT * FROM email_stats;
931id	email_id	date_sent	generated_sent_email
9321	NULL	2020-10-22 13:32:41	2020-$
933SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
934date_sent
9352020-10-22 13:32:41
936# Clean up.
937DROP TABLE email_stats;
938DROP TABLE emails;
939# Test-case 4
940CREATE TABLE emails (
941id int unsigned NOT NULL AUTO_INCREMENT,
942PRIMARY KEY (id)
943) ENGINE = INNODB;
944CREATE TABLE email_stats (
945id bigint unsigned NOT NULL AUTO_INCREMENT,
946email_id int unsigned DEFAULT NULL,
947date_sent datetime NOT NULL,
948generated_sent_email varchar(20) GENERATED ALWAYS AS
949(CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
950PRIMARY KEY (id),
951KEY idx_es1 (email_id),
952KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
953FOREIGN KEY (email_id) REFERENCES emails (id) ON UPDATE SET NULL
954) ENGINE = INNODB;
955INSERT INTO emails VALUES (1);
956INSERT INTO email_stats (id, email_id, date_sent)
957VALUES (1, 1, '2020-10-22 13:32:41');
958SELECT * FROM email_stats;
959id	email_id	date_sent	generated_sent_email
9601	1	2020-10-22 13:32:41	2020-1
961SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
962date_sent
9632020-10-22 13:32:41
964UPDATE emails SET id = 2 WHERE id = 1;
965SELECT * FROM email_stats;
966id	email_id	date_sent	generated_sent_email
9671	NULL	2020-10-22 13:32:41	2020-$
968SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
969date_sent
9702020-10-22 13:32:41
971DROP TABLE email_stats;
972DROP TABLE emails;
973CREATE TABLE emails (breaker int unsigned,
974KEY (breaker),
975id int unsigned NOT NULL AUTO_INCREMENT,
976PRIMARY KEY (id)
977) ENGINE=INNODB;
978CREATE TABLE email_stats (
979id bigint unsigned NOT NULL AUTO_INCREMENT,
980email_id int unsigned DEFAULT NULL,
981date_sent datetime NOT NULL,
982generated_sent_email varchar(20) GENERATED ALWAYS AS
983(CONCAT(YEAR(date_sent),
984'-',
985COALESCE(email_id, '$'))),
986PRIMARY KEY (id),
987KEY idx_es1 (email_id),
988KEY mautic_generated_sent_date_email (generated_sent_email, email_id),
989FOREIGN KEY fk_ea1 (email_id) REFERENCES emails (breaker)
990ON DELETE SET NULL
991) ENGINE=INNODB;
992show create table email_stats;
993Table	Create Table
994email_stats	CREATE TABLE `email_stats` (
995  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
996  `email_id` int(10) unsigned DEFAULT NULL,
997  `date_sent` datetime NOT NULL,
998  `generated_sent_email` varchar(20) GENERATED ALWAYS AS (concat(year(`date_sent`),'-',coalesce(`email_id`,'$'))) VIRTUAL,
999  PRIMARY KEY (`id`),
1000  KEY `idx_es1` (`email_id`),
1001  KEY `mautic_generated_sent_date_email` (`generated_sent_email`,`email_id`),
1002  CONSTRAINT `fk_ea1` FOREIGN KEY (`email_id`) REFERENCES `emails` (`breaker`) ON DELETE SET NULL
1003) ENGINE=InnoDB DEFAULT CHARSET=latin1
1004INSERT INTO emails VALUES (1,1);
1005INSERT INTO email_stats(id, email_id, date_sent)
1006VALUES (1, 1, '2020-10-22 13:32:41');
1007SELECT * FROM email_stats;
1008id	email_id	date_sent	generated_sent_email
10091	1	2020-10-22 13:32:41	2020-1
1010SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
1011date_sent
10122020-10-22 13:32:41
1013DELETE FROM emails;
1014SELECT * FROM email_stats;
1015id	email_id	date_sent	generated_sent_email
10161	NULL	2020-10-22 13:32:41	2020-$
1017SELECT date_sent
1018FROM email_stats force index (mautic_generated_sent_date_email)
1019WHERE generated_sent_email = '2020-$';
1020date_sent
10212020-10-22 13:32:41
1022SELECT date_sent
1023FROM email_stats force index (idx_es1)
1024WHERE generated_sent_email = '2020-$';
1025date_sent
10262020-10-22 13:32:41
1027DROP TABLE email_stats;
1028DROP TABLE emails;
1029