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
8fc13ecc
Commit
8fc13ecc
authored
Feb 03, 2005
by
jan@hundin.mysql.fi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed a bug: deadlock without any locking, simple select and update (Bug #7975).
parent
459fa7f1
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
39 additions
and
22 deletions
+39
-22
.bzrignore
.bzrignore
+1
-0
innobase/row/row0ins.c
innobase/row/row0ins.c
+23
-18
sql/ha_innodb.cc
sql/ha_innodb.cc
+15
-4
No files found.
.bzrignore
View file @
8fc13ecc
...
...
@@ -1055,3 +1055,4 @@ vio/viotest-ssl
include/mysqld_ername.h
include/mysqld_error.h
include/sql_state.h
innobase/row/row0index.c
innobase/row/row0ins.c
View file @
8fc13ecc
...
...
@@ -51,14 +51,19 @@ innobase_invalidate_query_cache(
chars count */
/**********************************************************************
This function returns true if SQL-query in the current thread
This function returns true if
1) SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
2) SQL-query in the current thread
is INSERT ON DUPLICATE KEY UPDATE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_replace
(
void
);
/*===========================*/
innobase_query_is_update
(
void
);
/*************************************************************************
Creates an insert node struct. */
...
...
@@ -1597,12 +1602,12 @@ row_ins_scan_sec_index_for_duplicate(
offsets
=
rec_get_offsets
(
rec
,
index
,
offsets
,
ULINT_UNDEFINED
,
&
heap
);
if
(
innobase_query_is_
replac
e
())
{
if
(
innobase_query_is_
updat
e
())
{
/*
The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
+ INSERT. Therefore, we should take X-lock for
duplicates
*/
/*
If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE).
*/
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_ORDINARY
,
rec
,
index
,
offsets
,
thr
);
...
...
@@ -1720,12 +1725,12 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate
errors as in original execution */
if
(
innobase_query_is_
replac
e
())
{
if
(
innobase_query_is_
updat
e
())
{
/*
The manual defines the REPLACE semantics
that it is either an INSERT or DELETE(s)
for duplicate key + INSERT. Therefore, we
should take X-lock for duplicates
*/
/*
If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE).
*/
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_REC_NOT_GAP
,
rec
,
cursor
->
index
,
...
...
@@ -1759,12 +1764,12 @@ row_ins_duplicate_error_in_clust(
offsets
=
rec_get_offsets
(
rec
,
cursor
->
index
,
offsets
,
ULINT_UNDEFINED
,
&
heap
);
/* The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
+ INSERT. Therefore, we should take X-lock for
duplicates. */
if
(
innobase_query_is_update
())
{
if
(
innobase_query_is_replace
())
{
/* If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE). */
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_REC_NOT_GAP
,
rec
,
...
...
sql/ha_innodb.cc
View file @
8fc13ecc
...
...
@@ -6142,13 +6142,19 @@ innobase_get_at_most_n_mbchars(
extern
"C"
{
/**********************************************************************
This function returns true if SQL-query in the current thread
This function returns true if
1) SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
2) SQL-query in the current thread
is INSERT ON DUPLICATE KEY UPDATE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_
replac
e
(
void
)
innobase_query_is_
updat
e
(
void
)
/*===========================*/
{
THD
*
thd
;
...
...
@@ -6160,9 +6166,14 @@ innobase_query_is_replace(void)
(
thd
->
lex
->
sql_command
==
SQLCOM_LOAD
&&
thd
->
lex
->
duplicates
==
DUP_REPLACE
))
{
return
true
;
}
else
{
return
false
;
}
if
(
thd
->
lex
->
sql_command
==
SQLCOM_INSERT
&&
thd
->
lex
->
duplicates
==
DUP_UPDATE
)
{
return
true
;
}
return
false
;
}
}
...
...
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