diff options
-rw-r--r-- | innobase/row/row0ins.c | 22 | ||||
-rw-r--r-- | sql/ha_innodb.cc | 25 |
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 */ |