Commit 4cc5ef04 authored by marko's avatar marko

Prevent ALTER TABLE ... MODIFY ... NOT NULL on columns for which

there is a foreign key constraint ON ... SET NULL.  (Bug #25927)

dict_foreign_find_index(): Add paramettter check_null.

dict_foreign_add_to_cache(): Do not allow ON DELETE SET NULL
or ON UPDATE SET NULL if any of the referencing columns are declared NOT NULL.
parent 48d8e981
......@@ -1970,9 +1970,12 @@ dict_foreign_find_index(
ulint n_cols, /* in: number of columns */
dict_index_t* types_idx, /* in: NULL or an index to whose types the
column types must match */
ibool check_charsets)
ibool check_charsets,
/* in: whether to check charsets.
only has an effect if types_idx != NULL */
ulint check_null)
/* in: nonzero if none of the columns must
be declared NOT NULL */
{
dict_index_t* index;
dict_field_t* field;
......@@ -2002,6 +2005,12 @@ dict_foreign_find_index(
break;
}
if (check_null
&& (field->col->prtype & DATA_NOT_NULL)) {
return(NULL);
}
if (types_idx && !cmp_cols_are_equal(
dict_index_get_nth_col(index, i),
dict_index_get_nth_col(types_idx,
......@@ -2118,7 +2127,7 @@ dict_foreign_add_to_cache(
ref_table,
(const char**) for_in_cache->referenced_col_names,
for_in_cache->n_fields, for_in_cache->foreign_index,
check_charsets);
check_charsets, FALSE);
if (index == NULL) {
dict_foreign_error_report(
......@@ -2150,7 +2159,10 @@ dict_foreign_add_to_cache(
for_table,
(const char**) for_in_cache->foreign_col_names,
for_in_cache->n_fields,
for_in_cache->referenced_index, check_charsets);
for_in_cache->referenced_index, check_charsets,
for_in_cache->type
& (DICT_FOREIGN_ON_DELETE_SET_NULL
| DICT_FOREIGN_ON_UPDATE_SET_NULL));
if (index == NULL) {
dict_foreign_error_report(
......@@ -2160,7 +2172,9 @@ dict_foreign_add_to_cache(
"the columns as the first columns,"
" or the data types in the\n"
"table do not match"
" the ones in the referenced table.");
" the ones in the referenced table\n"
"or one of the ON ... SET NULL columns"
" is declared NOT NULL.");
if (for_in_cache == foreign) {
if (added_to_referenced_list) {
......@@ -2966,7 +2980,8 @@ col_loop1:
/* Try to find an index which contains the columns
as the first fields and in the right order */
index = dict_foreign_find_index(table, column_names, i, NULL, TRUE);
index = dict_foreign_find_index(table, column_names, i,
NULL, TRUE, FALSE);
if (!index) {
mutex_enter(&dict_foreign_err_mutex);
......@@ -3237,7 +3252,8 @@ try_find_index:
if (referenced_table) {
index = dict_foreign_find_index(referenced_table,
column_names, i,
foreign->foreign_index, TRUE);
foreign->foreign_index,
TRUE, FALSE);
if (!index) {
dict_foreign_free(foreign);
mutex_enter(&dict_foreign_err_mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment