Commit d0930b8e authored by jan@hundin.mysql.fi's avatar jan@hundin.mysql.fi

Merge jlindstrom@bk-internal.mysql.com:/home/bk/mysql-4.1

into hundin.mysql.fi:/home/jan/talle/mysql-4.1
parents 105a2c1c d07ade55
......@@ -2244,7 +2244,7 @@ dict_foreign_add_to_cache(
Scans from pointer onwards. Stops if is at the start of a copy of
'string' where characters are compared without case sensitivity. Stops
also at '\0'. */
static
const char*
dict_scan_to(
/*=========*/
......
......@@ -891,6 +891,18 @@ dict_tables_have_same_db(
const char* name2); /* in: table name in the form
dbname '/' tablename */
/*************************************************************************
Scans from pointer onwards. Stops if is at the start of a copy of
'string' where characters are compared without case sensitivity. Stops
also at '\0'. */
const char*
dict_scan_to(
/*=========*/
/* out: scanned up to this */
const char* ptr, /* in: scan from */
const char* string);/* in: look for this */
/* Buffers for storing detailed information about the latest foreign key
and unique key errors */
extern FILE* dict_foreign_err_file;
......
......@@ -1482,8 +1482,8 @@ row_ins_scan_sec_index_for_duplicate(
ulint err = DB_SUCCESS;
ibool moved;
mtr_t mtr;
trx_t *trx;
ibool success;
trx_t* trx;
const char* ptr;
n_unique = dict_index_get_n_unique(index);
......@@ -1523,9 +1523,11 @@ row_ins_scan_sec_index_for_duplicate(
trx = thr_get_trx(thr);
ut_ad(trx);
dict_accept(*trx->mysql_query_str, "REPLACE", &success);
if (success) {
ptr = dict_scan_to(*(trx->mysql_query_str),
"REPLACE");
if ( ptr && *ptr != '\0') {
/* The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
......@@ -1605,7 +1607,7 @@ row_ins_duplicate_error_in_clust(
page_t* page;
ulint n_unique;
trx_t* trx = thr_get_trx(thr);
ibool success;
const char* ptr;
UT_NOT_USED(mtr);
......@@ -1639,10 +1641,9 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate
errors as in original execution */
dict_accept(*trx->mysql_query_str, "REPLACE",
&success);
ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE");
if (success) {
if (ptr && *ptr != '\0') {
/* The manual defines the REPLACE semantics
that it is either an INSERT or DELETE(s)
......@@ -1683,15 +1684,11 @@ row_ins_duplicate_error_in_clust(
/* 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.
*/
/* Is the first word in MySQL query REPLACE ? */
duplicates. */
dict_accept(*trx->mysql_query_str, "REPLACE",
&success);
ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE");
if (success) {
if (ptr && *ptr != '\0') {
err = row_ins_set_exclusive_rec_lock(
LOCK_REC_NOT_GAP,
......
......@@ -2794,7 +2794,7 @@ row_search_for_mysql(
rec_t* index_rec;
rec_t* clust_rec;
rec_t* old_vers;
ulint err;
ulint err = DB_SUCCESS;
ibool moved;
ibool cons_read_requires_clust_rec;
ibool was_lock_wait;
......@@ -3206,16 +3206,10 @@ rec_loop:
/* Try to place a lock on the index record */
/* If innodb_locks_unsafe_for_binlog option is used,
we lock only the record, i.e. next-key locking is
not used.
*/
if ( srv_locks_unsafe_for_binlog )
{
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type,
LOCK_REC_NOT_GAP, thr);
}
else
we do not lock gaps. Supremum record is really
a gap and therefore we do not set locks there. */
if ( srv_locks_unsafe_for_binlog == FALSE )
{
err = sel_set_rec_lock(rec, index,
prebuilt->select_lock_type,
......
......@@ -568,6 +568,7 @@ DROP TABLE t1;
#
# Bug #5723: length(<varchar utf8 field>) returns varying results
#
--disable_warnings
SET NAMES utf8;
--disable_warnings
CREATE TABLE t1 (
......
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