Loading mysql-test/r/information_schema.result +4 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ KEY_COLUMN_USAGE PARTITIONS PLUGINS PROCESSLIST REFERENTIAL_CONSTRAINTS ROUTINES SCHEMATA SCHEMA_PRIVILEGES Loading Loading @@ -745,7 +746,7 @@ CREATE TABLE t_crashme ( f1 BIGINT); CREATE VIEW a1 (t_CRASHME) AS SELECT f1 FROM t_crashme GROUP BY f1; CREATE VIEW a2 AS SELECT t_CRASHME FROM a1; count(*) 112 113 drop view a2, a1; drop table t_crashme; select table_schema,table_name, column_name from Loading Loading @@ -832,6 +833,7 @@ COLUMN_PRIVILEGES TABLE_NAME select FILES TABLE_NAME select KEY_COLUMN_USAGE TABLE_NAME select PARTITIONS TABLE_NAME select REFERENTIAL_CONSTRAINTS TABLE_NAME select STATISTICS TABLE_NAME select TABLES TABLE_NAME select TABLE_CONSTRAINTS TABLE_NAME select Loading @@ -843,7 +845,7 @@ flush privileges; SELECT table_schema, count(*) FROM information_schema.TABLES GROUP BY TABLE_SCHEMA; table_schema count(*) cluster 1 information_schema 22 information_schema 23 mysql 21 create table t1 (i int, j int); create trigger trg1 before insert on t1 for each row Loading mysql-test/r/information_schema_db.result +1 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ KEY_COLUMN_USAGE PARTITIONS PLUGINS PROCESSLIST REFERENTIAL_CONSTRAINTS ROUTINES SCHEMATA SCHEMA_PRIVILEGES Loading mysql-test/r/information_schema_inno.result +31 −0 Original line number Diff line number Diff line Loading @@ -25,3 +25,34 @@ NULL test PRIMARY NULL test t3 id 1 NULL NULL NULL NULL NULL test t3_ibfk_1 NULL test t3 id 1 1 test t2 t1_id NULL test t3_ibfk_1 NULL test t3 t2_id 2 2 test t2 id drop table t3, t2, t1; CREATE TABLE t1(a1 INT NOT NULL, a2 INT NOT NULL, PRIMARY KEY(a1, a2)) ENGINE=INNODB; CREATE TABLE t2(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A1 FOREIGN KEY (b1, b2) REFERENCES t1(a1, a2) ON UPDATE CASCADE ON DELETE NO ACTION) ENGINE=INNODB; CREATE TABLE t3(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A2 FOREIGN KEY (b1, b2) REFERENCES t2(b1, b2) ON UPDATE SET NULL ON DELETE RESTRICT) ENGINE=INNODB; CREATE TABLE t4(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A3 FOREIGN KEY (b1, b2) REFERENCES t3(b1, b2) ON UPDATE NO ACTION ON DELETE SET NULL) ENGINE=INNODB; CREATE TABLE t5(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A4 FOREIGN KEY (b1, b2) REFERENCES t4(b1, b2) ON UPDATE RESTRICT ON DELETE CASCADE) ENGINE=INNODB; select a.CONSTRAINT_SCHEMA, b.TABLE_NAME, CONSTRAINT_TYPE, b.CONSTRAINT_NAME, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE from information_schema.TABLE_CONSTRAINTS a, information_schema.REFERENTIAL_CONSTRAINTS b where a.CONSTRAINT_SCHEMA = 'test' and a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME; CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_NAME UNIQUE_CONSTRAINT_SCHEMA UNIQUE_CONSTRAINT_NAME MATCH_OPTION UPDATE_RULE DELETE_RULE test t2 FOREIGN KEY A1 test t1 NONE CASCADE NO ACTION test t3 FOREIGN KEY A2 test t2 NONE SET NULL RESTRICT test t4 FOREIGN KEY A3 test t3 NONE NO ACTION SET NULL test t5 FOREIGN KEY A4 test t4 NONE RESTRICT CASCADE drop tables t5, t4, t3, t2, t1; mysql-test/t/information_schema_inno.test +32 −0 Original line number Diff line number Diff line Loading @@ -21,3 +21,35 @@ select * from information_schema.KEY_COLUMN_USAGE where TABLE_SCHEMA= "test"; drop table t3, t2, t1; # # Test for REFERENTIAL_CONSTRAINTS table # CREATE TABLE t1(a1 INT NOT NULL, a2 INT NOT NULL, PRIMARY KEY(a1, a2)) ENGINE=INNODB; CREATE TABLE t2(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A1 FOREIGN KEY (b1, b2) REFERENCES t1(a1, a2) ON UPDATE CASCADE ON DELETE NO ACTION) ENGINE=INNODB; CREATE TABLE t3(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A2 FOREIGN KEY (b1, b2) REFERENCES t2(b1, b2) ON UPDATE SET NULL ON DELETE RESTRICT) ENGINE=INNODB; CREATE TABLE t4(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A3 FOREIGN KEY (b1, b2) REFERENCES t3(b1, b2) ON UPDATE NO ACTION ON DELETE SET NULL) ENGINE=INNODB; CREATE TABLE t5(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A4 FOREIGN KEY (b1, b2) REFERENCES t4(b1, b2) ON UPDATE RESTRICT ON DELETE CASCADE) ENGINE=INNODB; select a.CONSTRAINT_SCHEMA, b.TABLE_NAME, CONSTRAINT_TYPE, b.CONSTRAINT_NAME, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE from information_schema.TABLE_CONSTRAINTS a, information_schema.REFERENTIAL_CONSTRAINTS b where a.CONSTRAINT_SCHEMA = 'test' and a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME; drop tables t5, t4, t3, t2, t1; sql/ha_innodb.cc +49 −28 Original line number Diff line number Diff line Loading @@ -5827,35 +5827,56 @@ ha_innobase::get_foreign_key_list(THD *thd, List<FOREIGN_KEY_INFO> *f_key_list) break; } ulong length= 0; if (foreign->type == DICT_FOREIGN_ON_DELETE_CASCADE) { length=17; tmp_buff= "ON DELETE CASCADE"; ulong length; if (foreign->type & DICT_FOREIGN_ON_DELETE_CASCADE) { length=7; tmp_buff= "CASCADE"; } else if (foreign->type == DICT_FOREIGN_ON_DELETE_SET_NULL) { length=18; tmp_buff= "ON DELETE SET NULL"; else if (foreign->type & DICT_FOREIGN_ON_DELETE_SET_NULL) { length=8; tmp_buff= "SET NULL"; } else if (foreign->type == DICT_FOREIGN_ON_DELETE_NO_ACTION) { length=19; tmp_buff= "ON DELETE NO ACTION"; else if (foreign->type & DICT_FOREIGN_ON_DELETE_NO_ACTION) { length=9; tmp_buff= "NO ACTION"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_CASCADE) { length=17; tmp_buff= "ON UPDATE CASCADE"; else { length=8; tmp_buff= "RESTRICT"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_SET_NULL) { length=18; tmp_buff= "ON UPDATE SET NULL"; f_key_info.delete_method= make_lex_string(thd, f_key_info.delete_method, tmp_buff, length, 1); if (foreign->type & DICT_FOREIGN_ON_UPDATE_CASCADE) { length=7; tmp_buff= "CASCADE"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_NO_ACTION) { length=19; tmp_buff= "ON UPDATE NO ACTION"; else if (foreign->type & DICT_FOREIGN_ON_UPDATE_SET_NULL) { length=8; tmp_buff= "SET NULL"; } else if (foreign->type & DICT_FOREIGN_ON_UPDATE_NO_ACTION) { length=9; tmp_buff= "NO ACTION"; } f_key_info.constraint_method= make_lex_string(thd, f_key_info.constraint_method, else { length=8; tmp_buff= "RESTRICT"; } f_key_info.update_method= make_lex_string(thd, f_key_info.update_method, tmp_buff, length, 1); FOREIGN_KEY_INFO *pf_key_info= ((FOREIGN_KEY_INFO *) thd->memdup((gptr) &f_key_info, sizeof(FOREIGN_KEY_INFO))); Loading Loading
mysql-test/r/information_schema.result +4 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ KEY_COLUMN_USAGE PARTITIONS PLUGINS PROCESSLIST REFERENTIAL_CONSTRAINTS ROUTINES SCHEMATA SCHEMA_PRIVILEGES Loading Loading @@ -745,7 +746,7 @@ CREATE TABLE t_crashme ( f1 BIGINT); CREATE VIEW a1 (t_CRASHME) AS SELECT f1 FROM t_crashme GROUP BY f1; CREATE VIEW a2 AS SELECT t_CRASHME FROM a1; count(*) 112 113 drop view a2, a1; drop table t_crashme; select table_schema,table_name, column_name from Loading Loading @@ -832,6 +833,7 @@ COLUMN_PRIVILEGES TABLE_NAME select FILES TABLE_NAME select KEY_COLUMN_USAGE TABLE_NAME select PARTITIONS TABLE_NAME select REFERENTIAL_CONSTRAINTS TABLE_NAME select STATISTICS TABLE_NAME select TABLES TABLE_NAME select TABLE_CONSTRAINTS TABLE_NAME select Loading @@ -843,7 +845,7 @@ flush privileges; SELECT table_schema, count(*) FROM information_schema.TABLES GROUP BY TABLE_SCHEMA; table_schema count(*) cluster 1 information_schema 22 information_schema 23 mysql 21 create table t1 (i int, j int); create trigger trg1 before insert on t1 for each row Loading
mysql-test/r/information_schema_db.result +1 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ KEY_COLUMN_USAGE PARTITIONS PLUGINS PROCESSLIST REFERENTIAL_CONSTRAINTS ROUTINES SCHEMATA SCHEMA_PRIVILEGES Loading
mysql-test/r/information_schema_inno.result +31 −0 Original line number Diff line number Diff line Loading @@ -25,3 +25,34 @@ NULL test PRIMARY NULL test t3 id 1 NULL NULL NULL NULL NULL test t3_ibfk_1 NULL test t3 id 1 1 test t2 t1_id NULL test t3_ibfk_1 NULL test t3 t2_id 2 2 test t2 id drop table t3, t2, t1; CREATE TABLE t1(a1 INT NOT NULL, a2 INT NOT NULL, PRIMARY KEY(a1, a2)) ENGINE=INNODB; CREATE TABLE t2(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A1 FOREIGN KEY (b1, b2) REFERENCES t1(a1, a2) ON UPDATE CASCADE ON DELETE NO ACTION) ENGINE=INNODB; CREATE TABLE t3(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A2 FOREIGN KEY (b1, b2) REFERENCES t2(b1, b2) ON UPDATE SET NULL ON DELETE RESTRICT) ENGINE=INNODB; CREATE TABLE t4(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A3 FOREIGN KEY (b1, b2) REFERENCES t3(b1, b2) ON UPDATE NO ACTION ON DELETE SET NULL) ENGINE=INNODB; CREATE TABLE t5(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A4 FOREIGN KEY (b1, b2) REFERENCES t4(b1, b2) ON UPDATE RESTRICT ON DELETE CASCADE) ENGINE=INNODB; select a.CONSTRAINT_SCHEMA, b.TABLE_NAME, CONSTRAINT_TYPE, b.CONSTRAINT_NAME, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE from information_schema.TABLE_CONSTRAINTS a, information_schema.REFERENTIAL_CONSTRAINTS b where a.CONSTRAINT_SCHEMA = 'test' and a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME; CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_NAME UNIQUE_CONSTRAINT_SCHEMA UNIQUE_CONSTRAINT_NAME MATCH_OPTION UPDATE_RULE DELETE_RULE test t2 FOREIGN KEY A1 test t1 NONE CASCADE NO ACTION test t3 FOREIGN KEY A2 test t2 NONE SET NULL RESTRICT test t4 FOREIGN KEY A3 test t3 NONE NO ACTION SET NULL test t5 FOREIGN KEY A4 test t4 NONE RESTRICT CASCADE drop tables t5, t4, t3, t2, t1;
mysql-test/t/information_schema_inno.test +32 −0 Original line number Diff line number Diff line Loading @@ -21,3 +21,35 @@ select * from information_schema.KEY_COLUMN_USAGE where TABLE_SCHEMA= "test"; drop table t3, t2, t1; # # Test for REFERENTIAL_CONSTRAINTS table # CREATE TABLE t1(a1 INT NOT NULL, a2 INT NOT NULL, PRIMARY KEY(a1, a2)) ENGINE=INNODB; CREATE TABLE t2(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A1 FOREIGN KEY (b1, b2) REFERENCES t1(a1, a2) ON UPDATE CASCADE ON DELETE NO ACTION) ENGINE=INNODB; CREATE TABLE t3(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A2 FOREIGN KEY (b1, b2) REFERENCES t2(b1, b2) ON UPDATE SET NULL ON DELETE RESTRICT) ENGINE=INNODB; CREATE TABLE t4(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A3 FOREIGN KEY (b1, b2) REFERENCES t3(b1, b2) ON UPDATE NO ACTION ON DELETE SET NULL) ENGINE=INNODB; CREATE TABLE t5(b1 INT, b2 INT, INDEX (b1, b2), CONSTRAINT A4 FOREIGN KEY (b1, b2) REFERENCES t4(b1, b2) ON UPDATE RESTRICT ON DELETE CASCADE) ENGINE=INNODB; select a.CONSTRAINT_SCHEMA, b.TABLE_NAME, CONSTRAINT_TYPE, b.CONSTRAINT_NAME, UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_NAME, MATCH_OPTION, UPDATE_RULE, DELETE_RULE from information_schema.TABLE_CONSTRAINTS a, information_schema.REFERENTIAL_CONSTRAINTS b where a.CONSTRAINT_SCHEMA = 'test' and a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME; drop tables t5, t4, t3, t2, t1;
sql/ha_innodb.cc +49 −28 Original line number Diff line number Diff line Loading @@ -5827,35 +5827,56 @@ ha_innobase::get_foreign_key_list(THD *thd, List<FOREIGN_KEY_INFO> *f_key_list) break; } ulong length= 0; if (foreign->type == DICT_FOREIGN_ON_DELETE_CASCADE) { length=17; tmp_buff= "ON DELETE CASCADE"; ulong length; if (foreign->type & DICT_FOREIGN_ON_DELETE_CASCADE) { length=7; tmp_buff= "CASCADE"; } else if (foreign->type == DICT_FOREIGN_ON_DELETE_SET_NULL) { length=18; tmp_buff= "ON DELETE SET NULL"; else if (foreign->type & DICT_FOREIGN_ON_DELETE_SET_NULL) { length=8; tmp_buff= "SET NULL"; } else if (foreign->type == DICT_FOREIGN_ON_DELETE_NO_ACTION) { length=19; tmp_buff= "ON DELETE NO ACTION"; else if (foreign->type & DICT_FOREIGN_ON_DELETE_NO_ACTION) { length=9; tmp_buff= "NO ACTION"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_CASCADE) { length=17; tmp_buff= "ON UPDATE CASCADE"; else { length=8; tmp_buff= "RESTRICT"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_SET_NULL) { length=18; tmp_buff= "ON UPDATE SET NULL"; f_key_info.delete_method= make_lex_string(thd, f_key_info.delete_method, tmp_buff, length, 1); if (foreign->type & DICT_FOREIGN_ON_UPDATE_CASCADE) { length=7; tmp_buff= "CASCADE"; } else if (foreign->type == DICT_FOREIGN_ON_UPDATE_NO_ACTION) { length=19; tmp_buff= "ON UPDATE NO ACTION"; else if (foreign->type & DICT_FOREIGN_ON_UPDATE_SET_NULL) { length=8; tmp_buff= "SET NULL"; } else if (foreign->type & DICT_FOREIGN_ON_UPDATE_NO_ACTION) { length=9; tmp_buff= "NO ACTION"; } f_key_info.constraint_method= make_lex_string(thd, f_key_info.constraint_method, else { length=8; tmp_buff= "RESTRICT"; } f_key_info.update_method= make_lex_string(thd, f_key_info.update_method, tmp_buff, length, 1); FOREIGN_KEY_INFO *pf_key_info= ((FOREIGN_KEY_INFO *) thd->memdup((gptr) &f_key_info, sizeof(FOREIGN_KEY_INFO))); Loading