Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
23a5fc55
Commit
23a5fc55
authored
Apr 02, 2004
by
marko@hundin.mysql.fi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
InnoDB: ignore intra-database foreign key references between tables
when dropping database (Bug #3058)
parent
0219adc0
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
36 additions
and
19 deletions
+36
-19
innobase/dict/dict0crea.c
innobase/dict/dict0crea.c
+4
-4
innobase/dict/dict0dict.c
innobase/dict/dict0dict.c
+1
-1
innobase/include/dict0dict.h
innobase/include/dict0dict.h
+11
-0
innobase/include/row0mysql.h
innobase/include/row0mysql.h
+2
-1
innobase/row/row0mysql.c
innobase/row/row0mysql.c
+12
-10
innobase/trx/trx0roll.c
innobase/trx/trx0roll.c
+1
-1
sql/ha_innodb.cc
sql/ha_innodb.cc
+5
-2
No files found.
innobase/dict/dict0crea.c
View file @
23a5fc55
...
...
@@ -999,13 +999,13 @@ dict_create_or_check_foreign_constraint_tables(void)
if
(
table1
)
{
fprintf
(
stderr
,
"InnoDB: dropping incompletely created SYS_FOREIGN table
\n
"
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN"
,
trx
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN"
,
trx
,
TRUE
);
}
if
(
table2
)
{
fprintf
(
stderr
,
"InnoDB: dropping incompletely created SYS_FOREIGN_COLS table
\n
"
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN_COLS"
,
trx
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN_COLS"
,
trx
,
TRUE
);
}
fprintf
(
stderr
,
...
...
@@ -1054,8 +1054,8 @@ dict_create_or_check_foreign_constraint_tables(void)
fprintf
(
stderr
,
"InnoDB: dropping incompletely created SYS_FOREIGN tables
\n
"
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN"
,
trx
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN_COLS"
,
trx
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN"
,
trx
,
TRUE
);
row_drop_table_for_mysql
((
char
*
)
"SYS_FOREIGN_COLS"
,
trx
,
TRUE
);
error
=
DB_MUST_GET_MORE_FILE_SPACE
;
}
...
...
innobase/dict/dict0dict.c
View file @
23a5fc55
...
...
@@ -177,7 +177,7 @@ mutex_t dict_foreign_err_mutex; /* mutex protecting the foreign
/************************************************************************
Checks if the database name in two table names is the same. */
static
ibool
dict_tables_have_same_db
(
/*=====================*/
...
...
innobase/include/dict0dict.h
View file @
23a5fc55
...
...
@@ -834,6 +834,17 @@ Releases the dictionary system mutex for MySQL. */
void
dict_mutex_exit_for_mysql
(
void
);
/*===========================*/
/************************************************************************
Checks if the database name in two table names is the same. */
ibool
dict_tables_have_same_db
(
/*=====================*/
/* out: TRUE if same db name */
const
char
*
name1
,
/* in: table name in the form
dbname '/' tablename */
const
char
*
name2
);
/* in: table name in the form
dbname '/' tablename */
/* The following len must be at least 10000 bytes! */
#define DICT_FOREIGN_ERR_BUF_LEN 10000
...
...
innobase/include/row0mysql.h
View file @
23a5fc55
...
...
@@ -329,7 +329,8 @@ row_drop_table_for_mysql(
/*=====================*/
/* out: error code or DB_SUCCESS */
char
*
name
,
/* in: table name */
trx_t
*
trx
);
/* in: transaction handle */
trx_t
*
trx
,
/* in: transaction handle */
ibool
drop_db
);
/* in: TRUE=dropping whole database */
/*************************************************************************
Drops a database for MySQL. */
...
...
innobase/row/row0mysql.c
View file @
23a5fc55
...
...
@@ -1427,7 +1427,7 @@ row_create_table_for_mysql(
fprintf
(
stderr
,
"InnoDB: Warning: cannot create table %s because tablespace full
\n
"
,
table
->
name
);
row_drop_table_for_mysql
(
table
->
name
,
trx
);
row_drop_table_for_mysql
(
table
->
name
,
trx
,
FALSE
);
}
else
{
ut_a
(
err
==
DB_DUPLICATE_KEY
);
...
...
@@ -1542,7 +1542,7 @@ row_create_index_for_mysql(
trx_general_rollback_for_mysql
(
trx
,
FALSE
,
NULL
);
row_drop_table_for_mysql
(
index
->
table_name
,
trx
);
row_drop_table_for_mysql
(
index
->
table_name
,
trx
,
FALSE
);
trx
->
error_state
=
DB_SUCCESS
;
}
...
...
@@ -1607,7 +1607,7 @@ row_table_add_foreign_constraints(
trx_general_rollback_for_mysql
(
trx
,
FALSE
,
NULL
);
row_drop_table_for_mysql
(
name
,
trx
);
row_drop_table_for_mysql
(
name
,
trx
,
FALSE
);
trx
->
error_state
=
DB_SUCCESS
;
}
...
...
@@ -1638,7 +1638,7 @@ row_drop_table_for_mysql_in_background(
name); */
/* Drop the table in InnoDB */
error
=
row_drop_table_for_mysql
(
name
,
trx
);
error
=
row_drop_table_for_mysql
(
name
,
trx
,
FALSE
);
if
(
error
!=
DB_SUCCESS
)
{
fprintf
(
stderr
,
...
...
@@ -1795,9 +1795,10 @@ output by the master thread. */
int
row_drop_table_for_mysql
(
/*=====================*/
/* out: error code or DB_SUCCESS */
char
*
name
,
/* in: table name */
trx_t
*
trx
)
/* in: transaction handle */
/* out: error code or DB_SUCCESS */
char
*
name
,
/* in: table name */
trx_t
*
trx
,
/* in: transaction handle */
ibool
drop_db
)
/* in: TRUE=dropping whole database */
{
dict_foreign_t
*
foreign
;
dict_table_t
*
table
;
...
...
@@ -1981,7 +1982,9 @@ row_drop_table_for_mysql(
foreign
=
UT_LIST_GET_NEXT
(
referenced_list
,
foreign
);
}
if
(
foreign
&&
trx
->
check_foreigns
)
{
if
(
foreign
&&
trx
->
check_foreigns
&&
!
(
drop_db
&&
dict_tables_have_same_db
(
name
,
foreign
->
foreign_table_name
)))
{
char
*
buf
=
dict_foreign_err_buf
;
/* We only allow dropping a referenced table if
...
...
@@ -2112,7 +2115,6 @@ row_drop_database_for_mysql(
ut_a
(
strcmp
(
table_name
,
name
)
==
0
);
table
=
dict_table_get_low
(
table_name
);
fprintf
(
stderr
,
"drop %p:%s
\n
"
,
table
,
table_name
);
ut_a
(
table
);
...
...
@@ -2135,7 +2137,7 @@ fprintf(stderr, "drop %p:%s\n", table, table_name);
goto
loop
;
}
err
=
row_drop_table_for_mysql
(
table_name
,
trx
);
err
=
row_drop_table_for_mysql
(
table_name
,
trx
,
TRUE
);
mem_free
(
table_name
);
...
...
innobase/trx/trx0roll.c
View file @
23a5fc55
...
...
@@ -469,7 +469,7 @@ trx_rollback_or_clean_all_without_sess(void)
fprintf
(
stderr
,
"InnoDB: Table found: dropping table %s in recovery
\n
"
,
table
->
name
);
err
=
row_drop_table_for_mysql
(
table
->
name
,
trx
);
err
=
row_drop_table_for_mysql
(
table
->
name
,
trx
,
TRUE
);
ut_a
(
err
==
(
int
)
DB_SUCCESS
);
}
...
...
sql/ha_innodb.cc
View file @
23a5fc55
...
...
@@ -3631,7 +3631,8 @@ ha_innobase::delete_table(
/* Drop the table in InnoDB */
error
=
row_drop_table_for_mysql
(
norm_name
,
trx
);
error
=
row_drop_table_for_mysql
(
norm_name
,
trx
,
thd
->
lex
.
sql_command
==
SQLCOM_DROP_DB
);
/* Flush the log to reduce probability that the .frm files and
the InnoDB data dictionary get out-of-sync if the user runs
...
...
@@ -3670,7 +3671,7 @@ innobase_drop_database(
trx_t
*
trx
;
char
*
ptr
;
int
error
;
char
namebuf
[
10000
]
;
char
*
namebuf
;
/* Get the transaction associated with the current thd, or create one
if not yet created */
...
...
@@ -3690,6 +3691,7 @@ innobase_drop_database(
}
ptr
++
;
namebuf
=
my_malloc
(
len
+
2
,
MYF
(
0
));
memcpy
(
namebuf
,
ptr
,
len
);
namebuf
[
len
]
=
'/'
;
...
...
@@ -3706,6 +3708,7 @@ innobase_drop_database(
}
error
=
row_drop_database_for_mysql
(
namebuf
,
trx
);
my_free
(
namebuf
,
MYF
(
0
));
/* Flush the log to reduce probability that the .frm files and
the InnoDB data dictionary get out-of-sync if the user runs
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment