Commit 1927d24e authored by unknown's avatar unknown

Use already parsed SQL-query in the current thread when determining

was the query REPLACE or LOAD DATA INFILE REPLACE.


innobase/row/row0ins.c:
  Find SQL-query directly from current thread and see if the
  query was REPLACE or LOAD DATA INFILE REPLACE.
sql/ha_innodb.cc:
  Find current thread and return true if SQL-query in the current
  thread was either REPLACE or LOAD DATA INFILE REPLACE.
parent a55e4769
...@@ -50,6 +50,15 @@ innobase_invalidate_query_cache( ...@@ -50,6 +50,15 @@ innobase_invalidate_query_cache(
ulint full_name_len); /* in: full name length where also the null ulint full_name_len); /* in: full name length where also the null
chars count */ chars count */
/**********************************************************************
This function returns true if SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_replace(void);
/*===========================*/
/************************************************************************* /*************************************************************************
Creates an insert node struct. */ Creates an insert node struct. */
...@@ -1524,10 +1533,7 @@ row_ins_scan_sec_index_for_duplicate( ...@@ -1524,10 +1533,7 @@ row_ins_scan_sec_index_for_duplicate(
trx = thr_get_trx(thr); trx = thr_get_trx(thr);
ut_ad(trx); ut_ad(trx);
ptr = dict_scan_to(*(trx->mysql_query_str), if (innobase_query_is_replace()) {
"REPLACE");
if ( ptr && *ptr != '\0') {
/* The manual defines the REPLACE semantics that it /* The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key is either an INSERT or DELETE(s) for duplicate key
...@@ -1641,9 +1647,7 @@ row_ins_duplicate_error_in_clust( ...@@ -1641,9 +1647,7 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate sure that in roll-forward we get the same duplicate
errors as in original execution */ errors as in original execution */
ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (innobase_query_is_replace()) {
if (ptr && *ptr != '\0') {
/* The manual defines the REPLACE semantics /* The manual defines the REPLACE semantics
that it is either an INSERT or DELETE(s) that it is either an INSERT or DELETE(s)
...@@ -1686,9 +1690,7 @@ row_ins_duplicate_error_in_clust( ...@@ -1686,9 +1690,7 @@ row_ins_duplicate_error_in_clust(
+ INSERT. Therefore, we should take X-lock for + INSERT. Therefore, we should take X-lock for
duplicates. */ duplicates. */
ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (innobase_query_is_replace()) {
if (ptr && *ptr != '\0') {
err = row_ins_set_exclusive_rec_lock( err = row_ins_set_exclusive_rec_lock(
LOCK_REC_NOT_GAP, LOCK_REC_NOT_GAP,
......
...@@ -5468,4 +5468,29 @@ innobase_get_at_most_n_mbchars( ...@@ -5468,4 +5468,29 @@ innobase_get_at_most_n_mbchars(
} }
} }
extern "C" {
/**********************************************************************
This function returns true if SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_replace(void)
/*===========================*/
{
THD* thd;
thd = (THD *)innobase_current_thd();
if ( thd->lex->sql_command == SQLCOM_REPLACE ||
( thd->lex->sql_command == SQLCOM_LOAD &&
thd->lex->duplicates == DUP_REPLACE )) {
return true;
} else {
return false;
}
}
}
#endif /* HAVE_INNOBASE_DB */ #endif /* HAVE_INNOBASE_DB */
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