diff options
author | Jimmy Yang <jimmy.yang@oracle.com> | 2010-11-14 23:08:04 -0800 |
---|---|---|
committer | Jimmy Yang <jimmy.yang@oracle.com> | 2010-11-14 23:08:04 -0800 |
commit | f64026427e7906f2ec5a70bd3c4517f1abdd7cfb (patch) | |
tree | 50ecbccd5208808ce34d304b64440c54cc65b964 | |
parent | a8266151de28bb0afaaef4b73d386035c1525091 (diff) | |
download | mariadb-git-f64026427e7906f2ec5a70bd3c4517f1abdd7cfb.tar.gz |
Fix Bug #16290 Unclear error message when adding foreign key constraint
rb://502 approved by Sunny Bains
-rw-r--r-- | storage/innobase/dict/dict0dict.c | 4 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 25 | ||||
-rw-r--r-- | storage/innobase/include/db0err.h | 6 | ||||
-rw-r--r-- | storage/innobase/ut/ut0ut.c | 4 |
4 files changed, 37 insertions, 2 deletions
diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c index b4191ad2d6d..0d15ad8b716 100644 --- a/storage/innobase/dict/dict0dict.c +++ b/storage/innobase/dict/dict0dict.c @@ -3483,7 +3483,7 @@ col_loop1: start_of_latest_foreign); mutex_exit(&dict_foreign_err_mutex); - return(DB_CANNOT_ADD_CONSTRAINT); + return(DB_CHILD_NO_INDEX); } ptr = dict_accept(cs, ptr, "REFERENCES", &success); @@ -3764,7 +3764,7 @@ try_find_index: start_of_latest_foreign); mutex_exit(&dict_foreign_err_mutex); - return(DB_CANNOT_ADD_CONSTRAINT); + return(DB_PARENT_NO_INDEX); } } else { ut_a(trx->check_foreigns == FALSE); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 295dee7b007..b0d620c060d 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -960,6 +960,8 @@ convert_error_code_to_mysql( return(HA_ERR_ROW_IS_REFERENCED); case DB_CANNOT_ADD_CONSTRAINT: + case DB_CHILD_NO_INDEX: + case DB_PARENT_NO_INDEX: return(HA_ERR_CANNOT_ADD_FOREIGN); case DB_CANNOT_DROP_CONSTRAINT: @@ -6977,6 +6979,29 @@ ha_innobase::create( trx, stmt, stmt_len, norm_name, create_info->options & HA_LEX_CREATE_TMP_TABLE); + switch (error) { + + case DB_PARENT_NO_INDEX: + push_warning_printf( + thd, MYSQL_ERROR::WARN_LEVEL_WARN, + HA_ERR_CANNOT_ADD_FOREIGN, + "Create table '%s' with foreign key constraint" + " failed. There is no index in the referenced" + " table where the referenced columns appear" + " as the first columns.\n", norm_name); + break; + + case DB_CHILD_NO_INDEX: + push_warning_printf( + thd, MYSQL_ERROR::WARN_LEVEL_WARN, + HA_ERR_CANNOT_ADD_FOREIGN, + "Create table '%s' with foreign key constraint" + " failed. There is no index in the referencing" + " table where referencing columns appear" + " as the first columns.\n", norm_name); + break; + } + error = convert_error_code_to_mysql(error, flags, NULL); if (error) { diff --git a/storage/innobase/include/db0err.h b/storage/innobase/include/db0err.h index 01bb1b80754..8a71fa6511a 100644 --- a/storage/innobase/include/db0err.h +++ b/storage/innobase/include/db0err.h @@ -104,6 +104,12 @@ enum db_err { DB_FOREIGN_EXCEED_MAX_CASCADE, /* Foreign key constraint related cascading delete/update exceeds maximum allowed depth */ + DB_CHILD_NO_INDEX, /* the child (foreign) table does not + have an index that contains the + foreign keys as its prefix columns */ + DB_PARENT_NO_INDEX, /* the parent table does not + have an index that contains the + foreign keys as its prefix columns */ /* The following are partial failure codes */ DB_FAIL = 1000, diff --git a/storage/innobase/ut/ut0ut.c b/storage/innobase/ut/ut0ut.c index 39c60d2bc2f..4f4dfc5eed8 100644 --- a/storage/innobase/ut/ut0ut.c +++ b/storage/innobase/ut/ut0ut.c @@ -715,6 +715,10 @@ ut_strerr( return("Zip overflow"); case DB_RECORD_NOT_FOUND: return("Record not found"); + case DB_CHILD_NO_INDEX: + return("No index on referencing keys in referencing table"); + case DB_PARENT_NO_INDEX: + return("No index on referenced keys in referenced table"); case DB_END_OF_INDEX: return("End of index"); /* do not add default: in order to produce a warning if new code |