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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
d72c7984
Commit
d72c7984
authored
Feb 10, 2004
by
greg@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge gweir@bk-internal.mysql.com:/home/bk/mysql-4.0
into mysql.com:/bk/mysql-4.0
parents
2f711c88
efb134f3
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
228 additions
and
85 deletions
+228
-85
BUILD/Makefile.am
BUILD/Makefile.am
+1
-0
client/mysqlbinlog.cc
client/mysqlbinlog.cc
+155
-81
configure.in
configure.in
+1
-1
innobase/dict/dict0dict.c
innobase/dict/dict0dict.c
+18
-0
innobase/include/dict0dict.h
innobase/include/dict0dict.h
+9
-0
innobase/row/row0mysql.c
innobase/row/row0mysql.c
+7
-0
sql/ha_innodb.cc
sql/ha_innodb.cc
+22
-1
sql/ha_innodb.h
sql/ha_innodb.h
+1
-0
sql/handler.h
sql/handler.h
+3
-0
sql/sql_insert.cc
sql/sql_insert.cc
+11
-2
No files found.
BUILD/Makefile.am
View file @
d72c7984
...
...
@@ -37,6 +37,7 @@ EXTRA_DIST = FINISH.sh \
compile-pentium-pgcc
\
compile-solaris-sparc
\
compile-solaris-sparc-debug
\
compile-irix-mips64-mipspro
\
compile-solaris-sparc-forte
\
compile-solaris-sparc-purify
...
...
client/mysqlbinlog.cc
View file @
d72c7984
This diff is collapsed.
Click to expand it.
configure.in
View file @
d72c7984
...
...
@@ -348,7 +348,7 @@ AC_SUBST(CXXFLAGS)
AC_SUBST
(
LD
)
AC_SUBST
(
INSTALL_SCRIPT
)
export
CC C
FLAGS LD LDFLAGS
export
CC C
XX CFLAGS LD LDFLAGS AR
if
test
"
$GXX
"
=
"yes"
then
...
...
innobase/dict/dict0dict.c
View file @
d72c7984
...
...
@@ -1845,6 +1845,24 @@ dict_index_build_internal_non_clust(
/*====================== FOREIGN KEY PROCESSING ========================*/
/*************************************************************************
Checks if a table is referenced by foreign keys. */
ibool
dict_table_referenced_by_foreign_key
(
/*=================================*/
/* out: TRUE if table is referenced by a
foreign key */
dict_table_t
*
table
)
/* in: InnoDB table */
{
if
(
UT_LIST_GET_LEN
(
table
->
referenced_list
)
>
0
)
{
return
(
TRUE
);
}
return
(
FALSE
);
}
/*************************************************************************
Frees a foreign key struct. */
static
...
...
innobase/include/dict0dict.h
View file @
d72c7984
...
...
@@ -206,6 +206,15 @@ dict_foreign_add_to_cache(
/* out: DB_SUCCESS or error code */
dict_foreign_t
*
foreign
);
/* in, own: foreign key constraint */
/*************************************************************************
Checks if a table is referenced by foreign keys. */
ibool
dict_table_referenced_by_foreign_key
(
/*=================================*/
/* out: TRUE if table is referenced by a
foreign key */
dict_table_t
*
table
);
/* in: InnoDB table */
/*************************************************************************
Scans a table create SQL string and adds to the data dictionary
the foreign key constraints declared in the string. This function
should be called after the indexes for a table have been created.
...
...
innobase/row/row0mysql.c
View file @
d72c7984
...
...
@@ -1997,8 +1997,15 @@ row_drop_table_for_mysql(
goto
funct_exit
;
}
/* Check if the table is referenced by foreign key constraints from
some other table (not the table itself) */
foreign
=
UT_LIST_GET_FIRST
(
table
->
referenced_list
);
while
(
foreign
&&
foreign
->
foreign_table
==
table
)
{
foreign
=
UT_LIST_GET_NEXT
(
referenced_list
,
foreign
);
}
if
(
foreign
&&
trx
->
check_foreigns
)
{
char
*
buf
=
dict_foreign_err_buf
;
...
...
sql/ha_innodb.cc
View file @
d72c7984
...
...
@@ -4291,6 +4291,27 @@ ha_innobase::get_foreign_key_create_info(void)
return
(
str
);
}
/***********************************************************************
Checks if a table is referenced by a foreign key. The MySQL manual states that
a REPLACE is either equivalent to an INSERT, or DELETE(s) + INSERT. Only a
delete is then allowed internally to resolve a duplicate key conflict in
REPLACE, not an update. */
uint
ha_innobase
::
referenced_by_foreign_key
(
void
)
/*========================================*/
/* out: > 0 if referenced by a FOREIGN KEY */
{
row_prebuilt_t
*
prebuilt
=
(
row_prebuilt_t
*
)
innobase_prebuilt
;
if
(
dict_table_referenced_by_foreign_key
(
prebuilt
->
table
))
{
return
(
1
);
}
return
(
0
);
}
/***********************************************************************
Frees the foreign key create info for a table stored in InnoDB, if it is
non-NULL. */
...
...
sql/ha_innodb.h
View file @
d72c7984
...
...
@@ -179,6 +179,7 @@ class ha_innobase: public handler
int
check
(
THD
*
thd
,
HA_CHECK_OPT
*
check_opt
);
char
*
update_table_comment
(
const
char
*
comment
);
char
*
get_foreign_key_create_info
();
uint
referenced_by_foreign_key
();
void
free_foreign_key_create_info
(
char
*
str
);
THR_LOCK_DATA
**
store_lock
(
THD
*
thd
,
THR_LOCK_DATA
**
to
,
enum
thr_lock_type
lock_type
);
...
...
sql/handler.h
View file @
d72c7984
...
...
@@ -319,6 +319,9 @@ public:
virtual
void
append_create_info
(
String
*
packet
)
{}
virtual
char
*
get_foreign_key_create_info
()
{
return
(
NULL
);}
/* gets foreign key create string from InnoDB */
/* used in REPLACE; is > 0 if table is referred by a FOREIGN KEY */
virtual
uint
referenced_by_foreign_key
()
{
return
0
;}
virtual
void
init_table_handle_for_HANDLER
()
{
return
;
}
/* prepare InnoDB for HANDLER */
virtual
void
free_foreign_key_create_info
(
char
*
str
)
{}
...
...
sql/sql_insert.cc
View file @
d72c7984
...
...
@@ -438,11 +438,20 @@ int write_record(TABLE *table,COPY_INFO *info)
key_copy
((
byte
*
)
key
,
table
,
key_nr
,
0
);
if
((
error
=
(
table
->
file
->
index_read_idx
(
table
->
record
[
1
],
key_nr
,
(
byte
*
)
key
,
table
->
key_info
[
key_nr
].
key_length
,
table
->
key_info
[
key_nr
].
key_length
,
HA_READ_KEY_EXACT
))))
goto
err
;
}
if
(
last_uniq_key
(
table
,
key_nr
))
/*
The manual defines the REPLACE semantics that it is either an INSERT or
DELETE(s) + INSERT; FOREIGN KEY checks do not function in the defined
way if we allow MySQL to convert the latter operation internally to an
UPDATE.
*/
if
(
last_uniq_key
(
table
,
key_nr
)
&&
!
table
->
file
->
referenced_by_foreign_key
())
{
if
((
error
=
table
->
file
->
update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
goto
err
;
...
...
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