Commit 1927d24e authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -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,
+25 −0
Original line number Diff line number Diff line
@@ -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 */