Details
-
Bug
-
Status: Closed (View Workflow)
-
Blocker
-
Resolution: Fixed
-
10.2.2, 10.3.0
-
FreeBSD ports
Description
See SQL test case below for detail. See this thread for problem discovery:
https://lists.launchpad.net/maria-developers/msg11102.html
For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child
Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK.
MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour.
-- Server version: 10.2.12-MariaDB FreeBSD Ports
|
|
-- setup DB structure
|
|
SET FOREIGN_KEY_CHECKS=0; |
|
CREATE TABLE member ( |
id int(11) NOT NULL AUTO_INCREMENT, |
PRIMARY KEY (id) |
) ENGINE=InnoDB;
|
|
INSERT INTO member VALUES (1); |
|
CREATE TABLE address ( |
id int(11) NOT NULL AUTO_INCREMENT, |
member_id int(11) NOT NULL, |
PRIMARY KEY (id), |
KEY address_FI_1 (member_id), |
CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE |
) ENGINE=InnoDB;
|
|
INSERT INTO address VALUES (2,1); |
|
CREATE TABLE payment_method ( |
id int(11) NOT NULL AUTO_INCREMENT, |
member_id int(11) NOT NULL, |
cardholder_address_id int(11) DEFAULT NULL, |
PRIMARY KEY (id), |
KEY payment_method_FI_1 (member_id), |
KEY payment_method_FI_2 (cardholder_address_id), |
CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, |
CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE |
) ENGINE=InnoDB;
|
|
INSERT INTO payment_method VALUES (3,1,2); |
|
SET FOREIGN_KEY_CHECKS=1; |
|
-- show inserted data
|
|
SELECT * FROM member; |
+----+ |
| id |
|
+----+ |
| 1 |
|
+----+ |
|
SELECT * FROM address; |
+----+-----------+ |
| id | member_id |
|
+----+-----------+ |
| 2 | 1 |
|
+----+-----------+ |
|
SELECT * FROM payment_method; |
+----+-----------+-----------------------+ |
| id | member_id | cardholder_address_id |
|
+----+-----------+-----------------------+ |
| 3 | 1 | 2 |
|
+----+-----------+-----------------------+ |
|
-- finished setup now delete the central `member` record
|
DELETE FROM member WHERE id = 1; |
|
-- check the resulting state
|
|
SELECT * FROM member; |
-- empty set, correct
|
|
SELECT * FROM address; |
-- empty set, correct
|
|
SELECT * FROM payment_method; |
+----+-----------+-----------------------+ |
| id | member_id | cardholder_address_id |
|
+----+-----------+-----------------------+ |
| 3 | 1 | NULL | |
+----+-----------+-----------------------+ |
-- should be an empty set
|
-- referential integrity is broken: payment_method.member_id references a non-existent member.id
|
|
-- inconsistency continues during subsequent left join queries
|
|
SELECT
|
payment_method.id, member_id
|
FROM
|
payment_method
|
LEFT JOIN |
member ON member.id=payment_method.member_id |
WHERE
|
payment_method.member_id IS NOT NULL AND member.id IS NULL; |
|
-- empty set, when it should not be
|
-- note that if you dump and insert the broken DB, then above left join DOES show the broken FK, which is how I discovered it |
Attachments
Issue Links
- duplicates
-
MDEV-14222 Unnecessary 'cascade' memory allocation for every updated row when there is no FOREIGN KEY
-
- Closed
-
- is blocked by
-
MDEV-15219 FOREIGN KEY CASCADE or SET NULL operations will not resume after lock wait
-
- Closed
-
- relates to
-
MDEV-13902 Orphan rows despite ON DELETE CASCADE constraint
-
- Closed
-
-
MDEV-25087 Stack overflow upon exceeding FOREIGN KEY recursion depth
-
- Open
-
-
MDEV-9663 InnoDB assertion failure: *cursor->index->name == TEMP_INDEX_PREFIX, or !cursor->index->is_committed()
-
- Closed
-
-
MDEV-34403 Self-referencing table produces "Got error 193" from InnoDB on cascading DELETE
-
- Confirmed
-
Activity
Field | Original Value | New Value |
---|---|---|
Labels | delete foreign-keys | delete foreign-keys innodb |
Description |
See SQL test case below for detail.
For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be {code} |
See SQL test case below for detail.
For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- referential integrity is broken: payment_method.member_id references a non-existent member.id -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be {code} |
Description |
See SQL test case below for detail.
For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- referential integrity is broken: payment_method.member_id references a non-existent member.id -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be {code} |
See SQL test case below for detail. See this thread for problem discovery:
https://lists.launchpad.net/maria-developers/msg11102.html For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- referential integrity is broken: payment_method.member_id references a non-existent member.id -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be {code} |
Summary | Triangular FKs - Cascade delete leaves DB in state with broken referential integrity | Triangular FKs - Cascade delete causes broken referential integrity |
Description |
See SQL test case below for detail. See this thread for problem discovery:
https://lists.launchpad.net/maria-developers/msg11102.html For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- referential integrity is broken: payment_method.member_id references a non-existent member.id -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be {code} |
See SQL test case below for detail. See this thread for problem discovery:
https://lists.launchpad.net/maria-developers/msg11102.html For a "triangular" table FK structure (see attached png visual) deleting parent record, should delete both children, but the ON DELETE CASCADE does not delete record in 2nd child table when 2nd child has ON DELETE SET NULL constraint to 1st child Referential integrity is broken after parent is deleted. LEFT JOINs do not show broken FK. MySQL 5.7.21 and MariaDB 10.1.30 do not exhibit this broken behaviour. {code:sql} -- Server version: 10.2.12-MariaDB FreeBSD Ports -- setup DB structure SET FOREIGN_KEY_CHECKS=0; CREATE TABLE member ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB; INSERT INTO member VALUES (1); CREATE TABLE address ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, PRIMARY KEY (id), KEY address_FI_1 (member_id), CONSTRAINT address_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO address VALUES (2,1); CREATE TABLE payment_method ( id int(11) NOT NULL AUTO_INCREMENT, member_id int(11) NOT NULL, cardholder_address_id int(11) DEFAULT NULL, PRIMARY KEY (id), KEY payment_method_FI_1 (member_id), KEY payment_method_FI_2 (cardholder_address_id), CONSTRAINT payment_method_FK_1 FOREIGN KEY (member_id) REFERENCES member (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT payment_method_FK_2 FOREIGN KEY (cardholder_address_id) REFERENCES address (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO payment_method VALUES (3,1,2); SET FOREIGN_KEY_CHECKS=1; -- show inserted data SELECT * FROM member; +----+ | id | +----+ | 1 | +----+ SELECT * FROM address; +----+-----------+ | id | member_id | +----+-----------+ | 2 | 1 | +----+-----------+ SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | 2 | +----+-----------+-----------------------+ -- finished setup now delete the central `member` record DELETE FROM member WHERE id = 1; -- check the resulting state SELECT * FROM member; -- empty set, correct SELECT * FROM address; -- empty set, correct SELECT * FROM payment_method; +----+-----------+-----------------------+ | id | member_id | cardholder_address_id | +----+-----------+-----------------------+ | 3 | 1 | NULL | +----+-----------+-----------------------+ -- should be an empty set -- referential integrity is broken: payment_method.member_id references a non-existent member.id -- inconsistency continues during subsequent left join queries SELECT payment_method.id, member_id FROM payment_method LEFT JOIN member ON member.id=payment_method.member_id WHERE payment_method.member_id IS NOT NULL AND member.id IS NULL; -- empty set, when it should not be -- note that if you dump and insert the broken DB, then above left join DOES show the broken FK, which is how I discovered it {code} |
Fix Version/s | 10.2 [ 14601 ] |
Status | Open [ 1 ] | Confirmed [ 10101 ] |
Assignee | Marko Mäkelä [ marko ] |
Labels | delete foreign-keys innodb | delete foreign-keys innodb upstream-fixed |
Link |
This issue duplicates |
Link |
This issue is blocked by |
Priority | Major [ 3 ] | Blocker [ 1 ] |
Affects Version/s | 10.3.0 [ 22127 ] | |
Affects Version/s | 10.2.2 [ 22013 ] | |
Affects Version/s | 10.2.12 [ 22810 ] |
Fix Version/s | 10.3.5 [ 22905 ] | |
Fix Version/s | 10.2.13 [ 22910 ] | |
Fix Version/s | 10.2 [ 14601 ] |
Status | Confirmed [ 10101 ] | In Progress [ 3 ] |
Resolution | Fixed [ 1 ] | |
Status | In Progress [ 3 ] | Closed [ 6 ] |
Link |
This issue relates to |
Link | This issue relates to MDEV-25087 [ MDEV-25087 ] |
Workflow | MariaDB v3 [ 85408 ] | MariaDB v4 [ 153731 ] |
Link | This issue relates to MDEV-34403 [ MDEV-34403 ] |
Thanks for the report and the test case. Reproducible as described on 10.2, including older 10.2 releases (lowest that I tried was 10.2.4). Not reproducible on 10.1 and MySQL 5.7.
Debug builds abort with the assertion failure upon DELETE:
10.2 859fe1f24d499
mysqld: /data/src/10.2/storage/innobase/row/row0upd.cc:2839: dberr_t row_upd_clust_rec(ulint, upd_node_t*, dict_index_t*, ulint*, mem_heap_t**, que_thr_t*, mtr_t*): Assertion `!rec_get_deleted_flag(btr_cur_get_rec(btr_cur), dict_table_is_comp(index->table))' failed.
180204 14:48:46 [ERROR] mysqld got signal 6 ;
#7 0x00007f0d9b04cee2 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
#8 0x000055687e288dd3 in row_upd_clust_rec (flags=0, node=0x7f0d4003ff78, index=0x7f0d40038688, offsets=0x7f0d944b81f0, offsets_heap=0x7f0d944b8198, thr=0x7f0d40150548, mtr=0x7f0d944b8510) at /data/src/10.2/storage/innobase/row/row0upd.cc:2838
#9 0x000055687e289ee5 in row_upd_clust_step (node=0x7f0d4003ff78, thr=0x7f0d40150548) at /data/src/10.2/storage/innobase/row/row0upd.cc:3215
#10 0x000055687e28a189 in row_upd (node=0x7f0d4003ff78, thr=0x7f0d40150548) at /data/src/10.2/storage/innobase/row/row0upd.cc:3277
#11 0x000055687e28a669 in row_upd_step (thr=0x7f0d40150548) at /data/src/10.2/storage/innobase/row/row0upd.cc:3423
#12 0x000055687e22e129 in row_update_for_mysql (prebuilt=0x7f0d4014f798) at /data/src/10.2/storage/innobase/row/row0mysql.cc:1923
#13 0x000055687e0f28a2 in ha_innobase::delete_row (this=0x7f0d4014dea8, record=0x7f0d40091218 "\377\001") at /data/src/10.2/storage/innobase/handler/ha_innodb.cc:9341
#14 0x000055687dde891a in handler::ha_delete_row (this=0x7f0d4014dea8, buf=0x7f0d40091218 "\377\001") at /data/src/10.2/sql/handler.cc:6061
#15 0x000055687df77168 in mysql_delete (thd=0x7f0d40000b00, table_list=0x7f0d400125d0, conds=0x7f0d40012d80, order_list=0x7f0d40005038, limit=18446744073709551615, options=0, result=0x0) at /data/src/10.2/sql/sql_delete.cc:583
#16 0x000055687db6c052 in mysql_execute_command (thd=0x7f0d40000b00) at /data/src/10.2/sql/sql_parse.cc:4616
#17 0x000055687db763c2 in mysql_parse (thd=0x7f0d40000b00, rawbuf=0x7f0d400124e8 "DELETE FROM member WHERE id = 1", length=31, parser_state=0x7f0d944ba200, is_com_multi=false, is_next_command=false) at /data/src/10.2/sql/sql_parse.cc:7897
#18 0x000055687db64335 in dispatch_command (command=COM_QUERY, thd=0x7f0d40000b00, packet=0x7f0d4008d171 "DELETE FROM member WHERE id = 1", packet_length=31, is_com_multi=false, is_next_command=false) at /data/src/10.2/sql/sql_parse.cc:1806
#19 0x000055687db62c98 in do_command (thd=0x7f0d40000b00) at /data/src/10.2/sql/sql_parse.cc:1360
#20 0x000055687dcb0f28 in do_handle_one_connection (connect=0x55688115ceb0) at /data/src/10.2/sql/sql_connect.cc:1335
#21 0x000055687dcb0cb5 in handle_one_connection (arg=0x55688115ceb0) at /data/src/10.2/sql/sql_connect.cc:1241
#22 0x000055687e0d047e in pfs_spawn_thread (arg=0x5568810c0800) at /data/src/10.2/storage/perfschema/pfs.cc:1862
#23 0x00007f0d9cd23494 in start_thread (arg=0x7f0d944bb700) at pthread_create.c:333
#24 0x00007f0d9b10993f in clone () from /lib/x86_64-linux-gnu/libc.so.6