mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-17187: Code cleanup
fkerr_t: Errors for the foreign key checks. Replaces ulint, which used #define that looked like dberr_t literals. wsrep_dict_foreign_find_index(): Remove. Use dict_foreign_find_index() instead, with default parameters. dict_foreign_push_index_error(): Do not add redundant quotes around quoted table names.
This commit is contained in:
@ -25,7 +25,7 @@ create table t2(a int, constraint a foreign key a (a) references t1(a)) engine=i
|
||||
ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 150 Create table '`test`.`t2`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' foreign key a (a) references t1(a)) engine=innodb'.
|
||||
Warning 150 Create table `test`.`t2` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' foreign key a (a) references t1(a)) engine=innodb'.
|
||||
Error 1005 Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
drop table t1;
|
||||
@ -42,7 +42,7 @@ alter table t2 add constraint b foreign key (b) references t2(b);
|
||||
ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 150 Alter table '`test`.`t2`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' foreign key (b) references t2(b)'.
|
||||
Warning 150 Alter table `test`.`t2` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' foreign key (b) references t2(b)'.
|
||||
Error 1005 Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
drop table t2, t1;
|
||||
|
@ -1524,7 +1524,7 @@ ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p);
|
||||
ERROR HY000: Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 150 Alter table '`test`.`child`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Warning 150 Alter table `test`.`child` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
ALTER TABLE parent DROP INDEX idx1;
|
||||
@ -1532,7 +1532,7 @@ ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p);
|
||||
Got one of the listed errors
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 150 Alter table '`test`.`child`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Warning 150 Alter table `test`.`child` with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
ALTER TABLE child DROP INDEX idx2;
|
||||
@ -1540,7 +1540,7 @@ ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p);
|
||||
Got one of the listed errors
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 150 Alter table '`test`.`child`' with foreign key constraint failed. There is only prefix index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Warning 150 Alter table `test`.`child` with foreign key constraint failed. There is only prefix index in the referenced table where the referenced columns appear as the first columns near 'FOREIGN KEY(p) REFERENCES parent(p)'.
|
||||
Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
DROP TABLE child, parent;
|
||||
|
@ -3211,11 +3211,6 @@ dict_index_build_internal_fts(
|
||||
}
|
||||
/*====================== FOREIGN KEY PROCESSING ========================*/
|
||||
|
||||
#define DB_FOREIGN_KEY_IS_PREFIX_INDEX 200
|
||||
#define DB_FOREIGN_KEY_COL_NOT_NULL 201
|
||||
#define DB_FOREIGN_KEY_COLS_NOT_EQUAL 202
|
||||
#define DB_FOREIGN_KEY_INDEX_NOT_FOUND 203
|
||||
|
||||
/** Check whether the dict_table_t is a partition.
|
||||
A partitioned table on the SQL level is composed of InnoDB tables,
|
||||
where each InnoDB table is a [sub]partition including its secondary indexes
|
||||
@ -3322,7 +3317,7 @@ dict_foreign_find_index(
|
||||
/*!< in: nonzero if none of
|
||||
the columns must be declared
|
||||
NOT NULL */
|
||||
ulint* error, /*!< out: error code */
|
||||
fkerr_t* error, /*!< out: error code */
|
||||
ulint* err_col_no,
|
||||
/*!< out: column number where
|
||||
error happened */
|
||||
@ -3330,17 +3325,15 @@ dict_foreign_find_index(
|
||||
/*!< out: index where error
|
||||
happened */
|
||||
{
|
||||
dict_index_t* index;
|
||||
|
||||
ut_ad(mutex_own(&dict_sys->mutex));
|
||||
|
||||
if (error) {
|
||||
*error = DB_FOREIGN_KEY_INDEX_NOT_FOUND;
|
||||
*error = FK_INDEX_NOT_FOUND;
|
||||
}
|
||||
|
||||
index = dict_table_get_first_index(table);
|
||||
|
||||
while (index != NULL) {
|
||||
for (dict_index_t* index = dict_table_get_first_index(table);
|
||||
index;
|
||||
index = dict_table_get_next_index(index)) {
|
||||
if (types_idx != index
|
||||
&& !index->to_be_dropped
|
||||
&& !dict_index_is_online_ddl(index)
|
||||
@ -3348,42 +3341,17 @@ dict_foreign_find_index(
|
||||
table, col_names, columns, n_cols,
|
||||
index, types_idx,
|
||||
check_charsets, check_null,
|
||||
error, err_col_no,err_index)) {
|
||||
error, err_col_no, err_index)) {
|
||||
if (error) {
|
||||
*error = DB_SUCCESS;
|
||||
*error = FK_SUCCESS;
|
||||
}
|
||||
|
||||
return(index);
|
||||
}
|
||||
|
||||
index = dict_table_get_next_index(index);
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
#ifdef WITH_WSREP
|
||||
dict_index_t*
|
||||
wsrep_dict_foreign_find_index(
|
||||
/*====================*/
|
||||
dict_table_t* table, /*!< in: table */
|
||||
const char** col_names, /*!< in: column names, or NULL
|
||||
to use table->col_names */
|
||||
const char** columns,/*!< in: array of column names */
|
||||
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,
|
||||
/*!< 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 */
|
||||
{
|
||||
return dict_foreign_find_index(
|
||||
table, col_names, columns, n_cols, types_idx, check_charsets,
|
||||
check_null, NULL, NULL, NULL);
|
||||
}
|
||||
#endif /* WITH_WSREP */
|
||||
/**********************************************************************//**
|
||||
Report an error in a foreign key definition. */
|
||||
static
|
||||
@ -3480,15 +3448,11 @@ dict_foreign_add_to_cache(
|
||||
}
|
||||
|
||||
if (ref_table && !for_in_cache->referenced_table) {
|
||||
ulint index_error;
|
||||
ulint err_col;
|
||||
dict_index_t *err_index=NULL;
|
||||
|
||||
index = dict_foreign_find_index(
|
||||
ref_table, NULL,
|
||||
for_in_cache->referenced_col_names,
|
||||
for_in_cache->n_fields, for_in_cache->foreign_index,
|
||||
check_charsets, false, &index_error, &err_col, &err_index);
|
||||
check_charsets, false);
|
||||
|
||||
if (index == NULL
|
||||
&& !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) {
|
||||
@ -3520,10 +3484,6 @@ dict_foreign_add_to_cache(
|
||||
}
|
||||
|
||||
if (for_table && !for_in_cache->foreign_table) {
|
||||
ulint index_error;
|
||||
ulint err_col;
|
||||
dict_index_t *err_index=NULL;
|
||||
|
||||
index = dict_foreign_find_index(
|
||||
for_table, col_names,
|
||||
for_in_cache->foreign_col_names,
|
||||
@ -3531,8 +3491,7 @@ dict_foreign_add_to_cache(
|
||||
for_in_cache->referenced_index, check_charsets,
|
||||
for_in_cache->type
|
||||
& (DICT_FOREIGN_ON_DELETE_SET_NULL
|
||||
| DICT_FOREIGN_ON_UPDATE_SET_NULL),
|
||||
&index_error, &err_col, &err_index);
|
||||
| DICT_FOREIGN_ON_UPDATE_SET_NULL));
|
||||
|
||||
if (index == NULL
|
||||
&& !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) {
|
||||
@ -4244,7 +4203,7 @@ dict_foreign_push_index_error(
|
||||
const char* latest_foreign, /*!< in: start of latest foreign key
|
||||
constraint name */
|
||||
const char** columns, /*!< in: foreign key columns */
|
||||
ulint index_error, /*!< in: error code */
|
||||
fkerr_t index_error, /*!< in: error code */
|
||||
ulint err_col, /*!< in: column where error happened
|
||||
*/
|
||||
dict_index_t* err_index, /*!< in: index where error happened
|
||||
@ -4253,37 +4212,37 @@ dict_foreign_push_index_error(
|
||||
FILE* ef) /*!< in: output stream */
|
||||
{
|
||||
switch (index_error) {
|
||||
case DB_FOREIGN_KEY_INDEX_NOT_FOUND: {
|
||||
case FK_SUCCESS:
|
||||
break;
|
||||
case FK_INDEX_NOT_FOUND:
|
||||
fprintf(ef,
|
||||
"%s table '%s' with foreign key constraint"
|
||||
"%s table %s with foreign key constraint"
|
||||
" failed. There is no index in the referenced"
|
||||
" table where the referenced columns appear"
|
||||
" as the first columns near '%s'.\n",
|
||||
operation, create_name, latest_foreign);
|
||||
ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT,
|
||||
"%s table '%s' with foreign key constraint"
|
||||
"%s table %s with foreign key constraint"
|
||||
" failed. There is no index in the referenced"
|
||||
" table where the referenced columns appear"
|
||||
" as the first columns near '%s'.",
|
||||
operation, create_name, latest_foreign);
|
||||
break;
|
||||
}
|
||||
case DB_FOREIGN_KEY_IS_PREFIX_INDEX: {
|
||||
return;
|
||||
case FK_IS_PREFIX_INDEX:
|
||||
fprintf(ef,
|
||||
"%s table '%s' with foreign key constraint"
|
||||
"%s table %s with foreign key constraint"
|
||||
" failed. There is only prefix index in the referenced"
|
||||
" table where the referenced columns appear"
|
||||
" as the first columns near '%s'.\n",
|
||||
operation, create_name, latest_foreign);
|
||||
ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT,
|
||||
"%s table '%s' with foreign key constraint"
|
||||
"%s table %s with foreign key constraint"
|
||||
" failed. There is only prefix index in the referenced"
|
||||
" table where the referenced columns appear"
|
||||
" as the first columns near '%s'.",
|
||||
operation, create_name, latest_foreign);
|
||||
break;
|
||||
}
|
||||
case DB_FOREIGN_KEY_COL_NOT_NULL: {
|
||||
return;
|
||||
case FK_COL_NOT_NULL:
|
||||
fprintf(ef,
|
||||
"%s table %s with foreign key constraint"
|
||||
" failed. You have defined a SET NULL condition but "
|
||||
@ -4294,9 +4253,8 @@ dict_foreign_push_index_error(
|
||||
" failed. You have defined a SET NULL condition but "
|
||||
"column '%s' on index is defined as NOT NULL near '%s'.",
|
||||
operation, create_name, columns[err_col], latest_foreign);
|
||||
break;
|
||||
}
|
||||
case DB_FOREIGN_KEY_COLS_NOT_EQUAL: {
|
||||
return;
|
||||
case FK_COLS_NOT_EQUAL:
|
||||
dict_field_t* field;
|
||||
const char* col_name;
|
||||
field = dict_index_get_nth_field(err_index, err_col);
|
||||
@ -4315,11 +4273,9 @@ dict_foreign_push_index_error(
|
||||
" failed. Field type or character set for column '%s' "
|
||||
"does not mach referenced column '%s' near '%s'.",
|
||||
operation, create_name, columns[err_col], col_name, latest_foreign);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ut_error;
|
||||
return;
|
||||
}
|
||||
DBUG_ASSERT(!"unknown error");
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
@ -4351,7 +4307,7 @@ dict_create_foreign_constraints_low(
|
||||
const char* start_of_latest_foreign = sql_string;
|
||||
const char* start_of_latest_set = NULL;
|
||||
FILE* ef = dict_foreign_err_file;
|
||||
ulint index_error = DB_SUCCESS;
|
||||
fkerr_t index_error = FK_SUCCESS;
|
||||
dict_index_t* err_index = NULL;
|
||||
ulint err_col;
|
||||
const char* constraint_name;
|
||||
@ -6832,7 +6788,7 @@ dict_foreign_qualify_index(
|
||||
/*!< in: nonzero if none of
|
||||
the columns must be declared
|
||||
NOT NULL */
|
||||
ulint* error, /*!< out: error code */
|
||||
fkerr_t* error, /*!< out: error code */
|
||||
ulint* err_col_no,
|
||||
/*!< out: column number where
|
||||
error happened */
|
||||
@ -6860,7 +6816,7 @@ dict_foreign_qualify_index(
|
||||
/* We do not accept column prefix
|
||||
indexes here */
|
||||
if (error && err_col_no && err_index) {
|
||||
*error = DB_FOREIGN_KEY_IS_PREFIX_INDEX;
|
||||
*error = FK_IS_PREFIX_INDEX;
|
||||
*err_col_no = i;
|
||||
*err_index = (dict_index_t*)index;
|
||||
}
|
||||
@ -6870,7 +6826,7 @@ dict_foreign_qualify_index(
|
||||
if (check_null
|
||||
&& (field->col->prtype & DATA_NOT_NULL)) {
|
||||
if (error && err_col_no && err_index) {
|
||||
*error = DB_FOREIGN_KEY_COL_NOT_NULL;
|
||||
*error = FK_COL_NOT_NULL;
|
||||
*err_col_no = i;
|
||||
*err_index = (dict_index_t*)index;
|
||||
}
|
||||
@ -6900,7 +6856,7 @@ dict_foreign_qualify_index(
|
||||
dict_index_get_nth_col(types_idx, i),
|
||||
check_charsets)) {
|
||||
if (error && err_col_no && err_index) {
|
||||
*error = DB_FOREIGN_KEY_COLS_NOT_EQUAL;
|
||||
*error = FK_COLS_NOT_EQUAL;
|
||||
*err_col_no = i;
|
||||
*err_index = (dict_index_t*)index;
|
||||
}
|
||||
|
@ -10331,17 +10331,6 @@ next_record:
|
||||
}
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
extern dict_index_t*
|
||||
wsrep_dict_foreign_find_index(
|
||||
/*==========================*/
|
||||
dict_table_t* table,
|
||||
const char** col_names,
|
||||
const char** columns,
|
||||
ulint n_cols,
|
||||
dict_index_t* types_idx,
|
||||
ibool check_charsets,
|
||||
ulint check_null);
|
||||
|
||||
inline
|
||||
const char*
|
||||
wsrep_key_type_to_str(wsrep_key_type type)
|
||||
@ -10404,7 +10393,7 @@ wsrep_append_foreign_key(
|
||||
foreign->referenced_table_name_lookup);
|
||||
if (foreign->referenced_table) {
|
||||
foreign->referenced_index =
|
||||
wsrep_dict_foreign_find_index(
|
||||
dict_foreign_find_index(
|
||||
foreign->referenced_table, NULL,
|
||||
foreign->referenced_col_names,
|
||||
foreign->n_fields,
|
||||
@ -10418,7 +10407,7 @@ wsrep_append_foreign_key(
|
||||
|
||||
if (foreign->foreign_table) {
|
||||
foreign->foreign_index =
|
||||
wsrep_dict_foreign_find_index(
|
||||
dict_foreign_find_index(
|
||||
foreign->foreign_table, NULL,
|
||||
foreign->foreign_col_names,
|
||||
foreign->n_fields,
|
||||
|
@ -527,6 +527,21 @@ dict_table_open_on_name(
|
||||
dict_err_ignore_t ignore_err)
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
/** Outcome of dict_foreign_find_index() or dict_foreign_qualify_index() */
|
||||
enum fkerr_t
|
||||
{
|
||||
/** A backing index was found for a FOREIGN KEY constraint */
|
||||
FK_SUCCESS = 0,
|
||||
/** There is no index that covers the columns in the constraint. */
|
||||
FK_INDEX_NOT_FOUND,
|
||||
/** The index is for a prefix index, not a full column. */
|
||||
FK_IS_PREFIX_INDEX,
|
||||
/** A condition of SET NULL conflicts with a NOT NULL column. */
|
||||
FK_COL_NOT_NULL,
|
||||
/** The column types do not match */
|
||||
FK_COLS_NOT_EQUAL
|
||||
};
|
||||
|
||||
/*********************************************************************//**
|
||||
Tries to find an index whose first fields are the columns in the array,
|
||||
in the same order and is not marked for deletion and is not the same
|
||||
@ -553,11 +568,11 @@ dict_foreign_find_index(
|
||||
/*!< in: nonzero if none of
|
||||
the columns must be declared
|
||||
NOT NULL */
|
||||
ulint* error, /*!< out: error code */
|
||||
ulint* err_col_no,
|
||||
fkerr_t* error = NULL, /*!< out: error code */
|
||||
ulint* err_col_no = NULL,
|
||||
/*!< out: column number where
|
||||
error happened */
|
||||
dict_index_t** err_index)
|
||||
dict_index_t** err_index = NULL)
|
||||
/*!< out: index where error
|
||||
happened */
|
||||
|
||||
@ -643,7 +658,7 @@ dict_foreign_qualify_index(
|
||||
/*!< in: nonzero if none of
|
||||
the columns must be declared
|
||||
NOT NULL */
|
||||
ulint* error, /*!< out: error code */
|
||||
fkerr_t* error, /*!< out: error code */
|
||||
ulint* err_col_no,
|
||||
/*!< out: column number where
|
||||
error happened */
|
||||
|
Reference in New Issue
Block a user