@@ -826,3 +826,203 @@ DROP TABLE email_stats;
826
826
DROP TABLE emails_metadata;
827
827
DROP TABLE emails;
828
828
DROP DATABASE `a-b`;
829
+ USE test;
830
+ #
831
+ # Bug#33053297 VIRTUAL INDEX CORRUPTED DURING CASCADE UPDATE ON CHILD TABLE
832
+ #
833
+ # Test-Case 1
834
+ CREATE TABLE emails (
835
+ id int unsigned NOT NULL AUTO_INCREMENT,
836
+ PRIMARY KEY (id)
837
+ ) ENGINE=InnoDB;
838
+ CREATE TABLE email_stats (
839
+ id bigint unsigned NOT NULL AUTO_INCREMENT,
840
+ email_id int unsigned DEFAULT NULL,
841
+ date_sent datetime NOT NULL,
842
+ generated_sent_date date GENERATED ALWAYS AS
843
+ (concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
844
+ '-', lpad(dayofmonth(date_sent), 2, '0'))),
845
+ PRIMARY KEY (id),
846
+ KEY IDX_ES1 (email_id),
847
+ KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
848
+ FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
849
+ ) ENGINE = InnoDB;
850
+ INSERT INTO emails VALUES (1);
851
+ INSERT INTO email_stats (id, email_id, date_sent)
852
+ VALUES (1, 1, '2020-10-22 13:32:41');
853
+ SELECT * FROM email_stats;
854
+ id email_id date_sent generated_sent_date
855
+ 1 1 2020-10-22 13:32:41 2020-10-22
856
+ DELETE FROM emails;
857
+ DELETE FROM email_stats;
858
+ # Clean up.
859
+ DROP TABLE email_stats;
860
+ DROP TABLE emails;
861
+ # Test-Case 2
862
+ CREATE TABLE emails (
863
+ id int unsigned NOT NULL AUTO_INCREMENT,
864
+ PRIMARY KEY (id)
865
+ ) ENGINE = InnoDB
866
+ DEFAULT CHARSET = utf8mb4
867
+ COLLATE = utf8mb4_unicode_ci
868
+ ROW_FORMAT = DYNAMIC;
869
+ CREATE TABLE email_stats (
870
+ id bigint unsigned NOT NULL AUTO_INCREMENT,
871
+ email_id int unsigned DEFAULT NULL,
872
+ date_sent datetime NOT NULL,
873
+ generated_sent_date date GENERATED ALWAYS AS
874
+ (concat(year(date_sent), '-', lpad(month(date_sent), 2, '0'),
875
+ '-', lpad(dayofmonth(date_sent), 2, '0'))),
876
+ PRIMARY KEY (id),
877
+ KEY IDX_ES1 (email_id),
878
+ KEY mautic_generated_sent_date_email_id(generated_sent_date, email_id),
879
+ FOREIGN KEY (email_id) REFERENCES emails (id)
880
+ ON DELETE SET NULL
881
+ ON UPDATE SET NULL
882
+ ) ENGINE = InnoDB;
883
+ INSERT INTO emails VALUES (1);
884
+ INSERT INTO email_stats (id, email_id, date_sent)
885
+ VALUES (1, 1, '2020-10-22 13:32:41');
886
+ UPDATE emails SET id = 2 where id = 1;
887
+ SELECT id FROM email_stats WHERE generated_sent_date IS NULL;
888
+ id
889
+ SELECT * FROM email_stats;
890
+ id email_id date_sent generated_sent_date
891
+ 1 NULL 2020-10-22 13:32:41 2020-10-22
892
+ UPDATE email_stats
893
+ SET email_id=2
894
+ WHERE DATE(generated_sent_date) = '2020-10-22';
895
+ SELECT * FROM email_stats;
896
+ id email_id date_sent generated_sent_date
897
+ 1 2 2020-10-22 13:32:41 2020-10-22
898
+ # Clean up.
899
+ DROP TABLE email_stats;
900
+ DROP TABLE emails;
901
+ # Test-case 3
902
+ CREATE TABLE emails (
903
+ id int unsigned NOT NULL AUTO_INCREMENT,
904
+ PRIMARY KEY (id)
905
+ ) ENGINE = INNODB
906
+ DEFAULT CHARSET = utf8mb4
907
+ COLLATE = utf8mb4_unicode_ci
908
+ ROW_FORMAT = DYNAMIC;
909
+ CREATE TABLE email_stats (
910
+ id bigint unsigned NOT NULL AUTO_INCREMENT,
911
+ email_id int unsigned DEFAULT NULL,
912
+ date_sent datetime NOT NULL,
913
+ generated_sent_email varchar(20) GENERATED ALWAYS AS
914
+ (CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
915
+ PRIMARY KEY (id),
916
+ KEY idx_es1 (email_id),
917
+ KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
918
+ FOREIGN KEY (email_id) REFERENCES emails (id) ON DELETE SET NULL
919
+ ) ENGINE = INNODB;
920
+ INSERT INTO emails VALUES (1);
921
+ INSERT INTO email_stats (id, email_id, date_sent)
922
+ VALUES (1, 1, '2020-10-22 13:32:41');
923
+ SELECT * FROM email_stats;
924
+ id email_id date_sent generated_sent_email
925
+ 1 1 2020-10-22 13:32:41 2020-1
926
+ SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
927
+ date_sent
928
+ 2020-10-22 13:32:41
929
+ DELETE FROM emails;
930
+ SELECT * FROM email_stats;
931
+ id email_id date_sent generated_sent_email
932
+ 1 NULL 2020-10-22 13:32:41 2020-$
933
+ SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
934
+ date_sent
935
+ 2020-10-22 13:32:41
936
+ # Clean up.
937
+ DROP TABLE email_stats;
938
+ DROP TABLE emails;
939
+ # Test-case 4
940
+ CREATE TABLE emails (
941
+ id int unsigned NOT NULL AUTO_INCREMENT,
942
+ PRIMARY KEY (id)
943
+ ) ENGINE = INNODB;
944
+ CREATE TABLE email_stats (
945
+ id bigint unsigned NOT NULL AUTO_INCREMENT,
946
+ email_id int unsigned DEFAULT NULL,
947
+ date_sent datetime NOT NULL,
948
+ generated_sent_email varchar(20) GENERATED ALWAYS AS
949
+ (CONCAT(YEAR(date_sent), '-', COALESCE(email_id, '$'))),
950
+ PRIMARY KEY (id),
951
+ KEY idx_es1 (email_id),
952
+ KEY mautic_generated_sent_date_email(generated_sent_email, email_id),
953
+ FOREIGN KEY (email_id) REFERENCES emails (id) ON UPDATE SET NULL
954
+ ) ENGINE = INNODB;
955
+ INSERT INTO emails VALUES (1);
956
+ INSERT INTO email_stats (id, email_id, date_sent)
957
+ VALUES (1, 1, '2020-10-22 13:32:41');
958
+ SELECT * FROM email_stats;
959
+ id email_id date_sent generated_sent_email
960
+ 1 1 2020-10-22 13:32:41 2020-1
961
+ SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
962
+ date_sent
963
+ 2020-10-22 13:32:41
964
+ UPDATE emails SET id = 2 WHERE id = 1;
965
+ SELECT * FROM email_stats;
966
+ id email_id date_sent generated_sent_email
967
+ 1 NULL 2020-10-22 13:32:41 2020-$
968
+ SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-$';
969
+ date_sent
970
+ 2020-10-22 13:32:41
971
+ DROP TABLE email_stats;
972
+ DROP TABLE emails;
973
+ CREATE TABLE emails (breaker int unsigned,
974
+ KEY (breaker),
975
+ id int unsigned NOT NULL AUTO_INCREMENT,
976
+ PRIMARY KEY (id)
977
+ ) ENGINE=INNODB;
978
+ CREATE TABLE email_stats (
979
+ id bigint unsigned NOT NULL AUTO_INCREMENT,
980
+ email_id int unsigned DEFAULT NULL,
981
+ date_sent datetime NOT NULL,
982
+ generated_sent_email varchar(20) GENERATED ALWAYS AS
983
+ (CONCAT(YEAR(date_sent),
984
+ '-',
985
+ COALESCE(email_id, '$'))),
986
+ PRIMARY KEY (id),
987
+ KEY idx_es1 (email_id),
988
+ KEY mautic_generated_sent_date_email (generated_sent_email, email_id),
989
+ FOREIGN KEY fk_ea1 (email_id) REFERENCES emails (breaker)
990
+ ON DELETE SET NULL
991
+ ) ENGINE=INNODB;
992
+ show create table email_stats;
993
+ Table Create Table
994
+ email_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
1004
+ INSERT INTO emails VALUES (1,1);
1005
+ INSERT INTO email_stats(id, email_id, date_sent)
1006
+ VALUES (1, 1, '2020-10-22 13:32:41');
1007
+ SELECT * FROM email_stats;
1008
+ id email_id date_sent generated_sent_email
1009
+ 1 1 2020-10-22 13:32:41 2020-1
1010
+ SELECT date_sent FROM email_stats WHERE generated_sent_email = '2020-1';
1011
+ date_sent
1012
+ 2020-10-22 13:32:41
1013
+ DELETE FROM emails;
1014
+ SELECT * FROM email_stats;
1015
+ id email_id date_sent generated_sent_email
1016
+ 1 NULL 2020-10-22 13:32:41 2020-$
1017
+ SELECT date_sent
1018
+ FROM email_stats force index (mautic_generated_sent_date_email)
1019
+ WHERE generated_sent_email = '2020-$';
1020
+ date_sent
1021
+ 2020-10-22 13:32:41
1022
+ SELECT date_sent
1023
+ FROM email_stats force index (idx_es1)
1024
+ WHERE generated_sent_email = '2020-$';
1025
+ date_sent
1026
+ 2020-10-22 13:32:41
1027
+ DROP TABLE email_stats;
1028
+ DROP TABLE emails;
0 commit comments