Merge bk-internal:/home/bk/mysql-5.1-engines
into pippilotta.erinye.com:/shared/home/df/mysql/build/mysql-5.1-build-marvel-engines sql/sql_insert.cc: Auto merged
This commit is contained in:
commit
705e7a748e
@ -426,7 +426,6 @@ void upgrade_lock_type(THD *thd, thr_lock_type *lock_type,
|
|||||||
client connection and the delayed thread.
|
client connection and the delayed thread.
|
||||||
*/
|
*/
|
||||||
if (specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE) ||
|
if (specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE) ||
|
||||||
thd->slave_thread ||
|
|
||||||
thd->variables.max_insert_delayed_threads == 0 ||
|
thd->variables.max_insert_delayed_threads == 0 ||
|
||||||
thd->prelocked_mode ||
|
thd->prelocked_mode ||
|
||||||
thd->lex->uses_stored_routines())
|
thd->lex->uses_stored_routines())
|
||||||
@ -434,6 +433,14 @@ void upgrade_lock_type(THD *thd, thr_lock_type *lock_type,
|
|||||||
*lock_type= TL_WRITE;
|
*lock_type= TL_WRITE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (thd->slave_thread)
|
||||||
|
{
|
||||||
|
/* Try concurrent insert */
|
||||||
|
*lock_type= (duplic == DUP_UPDATE || duplic == DUP_REPLACE) ?
|
||||||
|
TL_WRITE : TL_WRITE_CONCURRENT_INSERT;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool log_on= (thd->options & OPTION_BIN_LOG ||
|
bool log_on= (thd->options & OPTION_BIN_LOG ||
|
||||||
! (thd->security_ctx->master_access & SUPER_ACL));
|
! (thd->security_ctx->master_access & SUPER_ACL));
|
||||||
if (global_system_variables.binlog_format == BINLOG_FORMAT_STMT &&
|
if (global_system_variables.binlog_format == BINLOG_FORMAT_STMT &&
|
||||||
|
@ -94,42 +94,63 @@ int mi_rkey(MI_INFO *info, uchar *buf, int inx, const uchar *key,
|
|||||||
myisam_read_vec[search_flag], info->s->state.key_root[inx]))
|
myisam_read_vec[search_flag], info->s->state.key_root[inx]))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
If we searching for a partial key (or using >, >=, < or <=) and
|
Found a key, but it might not be usable. We cannot use rows that
|
||||||
the data is outside of the data file, we need to continue searching
|
are inserted by other threads after we got our table lock
|
||||||
for the first key inside the data file
|
("concurrent inserts"). The record may not even be present yet.
|
||||||
|
Keys are inserted into the index(es) before the record is
|
||||||
|
inserted into the data file. When we got our table lock, we
|
||||||
|
saved the current data_file_length. Concurrent inserts always go
|
||||||
|
to the end of the file. So we can test if the found key
|
||||||
|
references a new record.
|
||||||
*/
|
*/
|
||||||
if (info->lastpos >= info->state->data_file_length &&
|
if (info->lastpos >= info->state->data_file_length)
|
||||||
(search_flag != HA_READ_KEY_EXACT ||
|
|
||||||
last_used_keyseg != keyinfo->seg + keyinfo->keysegs))
|
|
||||||
{
|
{
|
||||||
do
|
/* The key references a concurrently inserted record. */
|
||||||
|
if (search_flag == HA_READ_KEY_EXACT &&
|
||||||
|
last_used_keyseg == keyinfo->seg + keyinfo->keysegs)
|
||||||
|
{
|
||||||
|
/* Simply ignore the key if it matches exactly. (Bug #29838) */
|
||||||
|
my_errno= HA_ERR_KEY_NOT_FOUND;
|
||||||
|
info->lastpos= HA_OFFSET_ERROR;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
uint not_used[2];
|
|
||||||
/*
|
/*
|
||||||
Skip rows that are inserted by other threads since we got a lock
|
If searching for a partial key (or using >, >=, < or <=) and
|
||||||
Note that this can only happen if we are not searching after an
|
the data is outside of the data file, we need to continue
|
||||||
full length exact key, because the keys are sorted
|
searching for the first key inside the data file.
|
||||||
according to position
|
|
||||||
*/
|
*/
|
||||||
if (_mi_search_next(info, keyinfo, info->lastkey,
|
do
|
||||||
info->lastkey_length,
|
|
||||||
myisam_readnext_vec[search_flag],
|
|
||||||
info->s->state.key_root[inx]))
|
|
||||||
break;
|
|
||||||
/*
|
|
||||||
Check that the found key does still match the search.
|
|
||||||
_mi_search_next() delivers the next key regardless of its
|
|
||||||
value.
|
|
||||||
*/
|
|
||||||
if (search_flag == HA_READ_KEY_EXACT &&
|
|
||||||
ha_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length,
|
|
||||||
SEARCH_FIND, not_used))
|
|
||||||
{
|
{
|
||||||
my_errno= HA_ERR_KEY_NOT_FOUND;
|
uint not_used[2];
|
||||||
info->lastpos= HA_OFFSET_ERROR;
|
/*
|
||||||
break;
|
Skip rows that are inserted by other threads since we got
|
||||||
}
|
a lock. Note that this can only happen if we are not
|
||||||
} while (info->lastpos >= info->state->data_file_length);
|
searching after a full length exact key, because the keys
|
||||||
|
are sorted according to position.
|
||||||
|
*/
|
||||||
|
if (_mi_search_next(info, keyinfo, info->lastkey,
|
||||||
|
info->lastkey_length,
|
||||||
|
myisam_readnext_vec[search_flag],
|
||||||
|
info->s->state.key_root[inx]))
|
||||||
|
break; /* purecov: inspected */
|
||||||
|
/*
|
||||||
|
Check that the found key does still match the search.
|
||||||
|
_mi_search_next() delivers the next key regardless of its
|
||||||
|
value.
|
||||||
|
*/
|
||||||
|
if (search_flag == HA_READ_KEY_EXACT &&
|
||||||
|
ha_key_cmp(keyinfo->seg, key_buff, info->lastkey,
|
||||||
|
use_key_length, SEARCH_FIND, not_used))
|
||||||
|
{
|
||||||
|
/* purecov: begin inspected */
|
||||||
|
my_errno= HA_ERR_KEY_NOT_FOUND;
|
||||||
|
info->lastpos= HA_OFFSET_ERROR;
|
||||||
|
break;
|
||||||
|
/* purecov: end */
|
||||||
|
}
|
||||||
|
} while (info->lastpos >= info->state->data_file_length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user