summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--innobase/row/row0ins.c22
-rw-r--r--sql/ha_innodb.cc25
2 files changed, 37 insertions, 10 deletions
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 3008d6a3812..c9c784403c8 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -50,6 +50,15 @@ innobase_invalidate_query_cache(
ulint full_name_len); /* in: full name length where also the null
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. */
@@ -1524,10 +1533,7 @@ row_ins_scan_sec_index_for_duplicate(
trx = thr_get_trx(thr);
ut_ad(trx);
- ptr = dict_scan_to(*(trx->mysql_query_str),
- "REPLACE");
-
- if ( ptr && *ptr != '\0') {
+ if (innobase_query_is_replace()) {
/* The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
@@ -1641,9 +1647,7 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate
errors as in original execution */
- ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE");
-
- if (ptr && *ptr != '\0') {
+ if (innobase_query_is_replace()) {
/* The manual defines the REPLACE semantics
that it is either an INSERT or DELETE(s)
@@ -1686,9 +1690,7 @@ row_ins_duplicate_error_in_clust(
+ INSERT. Therefore, we should take X-lock for
duplicates. */
- ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE");
-
- if (ptr && *ptr != '\0') {
+ if (innobase_query_is_replace()) {
err = row_ins_set_exclusive_rec_lock(
LOCK_REC_NOT_GAP,
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index d748c005d02..28f95611ae7 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -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 */