Commit bbd993d9 authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

[t:3414], merge to main

git-svn-id: file:///svn/mysql/tokudb-engine/tokudb-engine@38189 c7de825b-a66e-492c-adef-691d508d4ae1
parent 576f6fcd
...@@ -3605,13 +3605,14 @@ void ha_tokudb::test_row_packing(uchar* record, DBT* pk_key, DBT* pk_val) { ...@@ -3605,13 +3605,14 @@ void ha_tokudb::test_row_packing(uchar* record, DBT* pk_key, DBT* pk_val) {
// //
void ha_tokudb::set_main_dict_put_flags( void ha_tokudb::set_main_dict_put_flags(
THD* thd, THD* thd,
u_int32_t* put_flags, u_int32_t* put_flags
bool no_overwrite_no_error_allowed
) )
{ {
u_int32_t old_prelock_flags = (*put_flags)&(DB_PRELOCKED_FILE_READ); u_int32_t old_prelock_flags = (*put_flags)&(DB_PRELOCKED_FILE_READ);
uint curr_num_DBs = table->s->keys + test(hidden_primary_key); uint curr_num_DBs = table->s->keys + test(hidden_primary_key);
bool in_hot_index = share->num_DBs > curr_num_DBs; bool in_hot_index = share->num_DBs > curr_num_DBs;
bool using_ignore_flag_opt = do_ignore_flag_optimization(
thd, table, share->replace_into_fast);
// //
// optimization for "REPLACE INTO..." (and "INSERT IGNORE") command // optimization for "REPLACE INTO..." (and "INSERT IGNORE") command
// if the command is "REPLACE INTO" and the only table // if the command is "REPLACE INTO" and the only table
...@@ -3623,31 +3624,28 @@ void ha_tokudb::set_main_dict_put_flags( ...@@ -3623,31 +3624,28 @@ void ha_tokudb::set_main_dict_put_flags(
// to do. We cannot do this if otherwise, because then we lose // to do. We cannot do this if otherwise, because then we lose
// consistency between indexes // consistency between indexes
// //
if (hidden_primary_key){ if (hidden_primary_key)
{
*put_flags = old_prelock_flags; *put_flags = old_prelock_flags;
} }
else if (thd_test_options(thd, OPTION_RELAXED_UNIQUE_CHECKS) && else if (thd_test_options(thd, OPTION_RELAXED_UNIQUE_CHECKS)
!is_replace_into(thd) && && !is_replace_into(thd) && !is_insert_ignore(thd))
!is_insert_ignore(thd)
)
{ {
*put_flags = old_prelock_flags; *put_flags = old_prelock_flags;
} }
else if (do_ignore_flag_optimization(thd,table,share->replace_into_fast) && else if (using_ignore_flag_opt && is_replace_into(thd)
is_replace_into(thd) && !in_hot_index && !in_hot_index)
)
{ {
*put_flags = old_prelock_flags; *put_flags = old_prelock_flags;
} }
else if (do_ignore_flag_optimization(thd,table,share->replace_into_fast) && else if (using_ignore_flag_opt && is_insert_ignore(thd)
is_insert_ignore(thd) && no_overwrite_no_error_allowed && !in_hot_index && !in_hot_index)
)
{ {
*put_flags = DB_NOOVERWRITE_NO_ERROR|old_prelock_flags; *put_flags = DB_NOOVERWRITE_NO_ERROR | old_prelock_flags;
} }
else else
{ {
*put_flags = DB_NOOVERWRITE|old_prelock_flags; *put_flags = DB_NOOVERWRITE | old_prelock_flags;
} }
} }
...@@ -3659,7 +3657,7 @@ int ha_tokudb::insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk ...@@ -3659,7 +3657,7 @@ int ha_tokudb::insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk
assert(curr_num_DBs == 1); assert(curr_num_DBs == 1);
set_main_dict_put_flags(thd, &put_flags, true); set_main_dict_put_flags(thd, &put_flags);
error = share->file->put( error = share->file->put(
share->file, share->file,
...@@ -3681,22 +3679,56 @@ int ha_tokudb::insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk ...@@ -3681,22 +3679,56 @@ int ha_tokudb::insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk
int ha_tokudb::insert_rows_to_dictionaries_mult(DBT* pk_key, DBT* pk_val, DB_TXN* txn, THD* thd) { int ha_tokudb::insert_rows_to_dictionaries_mult(DBT* pk_key, DBT* pk_val, DB_TXN* txn, THD* thd) {
int error = 0; int error = 0;
uint curr_num_DBs = share->num_DBs; uint curr_num_DBs = share->num_DBs;
set_main_dict_put_flags(thd, &mult_put_flags[primary_key]);
uint32_t i, flags = mult_put_flags[primary_key];
// the insert ignore optimization uses DB_NOOVERWRITE_NO_ERROR,
// which is not allowed with env->put_multiple.
// we have to insert the rows one by one in this case.
if (flags & DB_NOOVERWRITE_NO_ERROR) {
DB * src_db = share->key_file[primary_key];
for (i = 0; i < curr_num_DBs; i++) {
DB * db = share->key_file[i];
if (i == primary_key) {
// if it's the primary key, insert the rows
// as they are.
error = db->put(db, txn, pk_key, pk_val, flags);
} else {
// generate a row for secondary keys.
// use our multi put key/rec buffers
// just as the ydb layer would have in
// env->put_multiple(), except that
// we will just do a put() right away.
error = tokudb_generate_row(db, src_db,
&mult_key_dbt[i], &mult_rec_dbt[i],
pk_key, pk_val);
if (error != 0) {
goto out;
}
error = db->put(db, txn, &mult_key_dbt[i],
&mult_rec_dbt[i], flags);
}
if (error != 0) {
goto out;
}
}
} else {
// not insert ignore, so we can use put multiple
error = db_env->put_multiple(
db_env,
share->key_file[primary_key],
txn,
pk_key,
pk_val,
curr_num_DBs,
share->key_file,
mult_key_dbt,
mult_rec_dbt,
mult_put_flags
);
}
set_main_dict_put_flags(thd, &mult_put_flags[primary_key], false); out:
error = db_env->put_multiple(
db_env,
share->key_file[primary_key],
txn,
pk_key,
pk_val,
curr_num_DBs,
share->key_file,
mult_key_dbt,
mult_rec_dbt,
mult_put_flags
);
// //
// We break if we hit an error, unless it is a dup key error // We break if we hit an error, unless it is a dup key error
// and MySQL told us to ignore duplicate key errors // and MySQL told us to ignore duplicate key errors
...@@ -4009,7 +4041,7 @@ int ha_tokudb::update_row(const uchar * old_row, uchar * new_row) { ...@@ -4009,7 +4041,7 @@ int ha_tokudb::update_row(const uchar * old_row, uchar * new_row) {
error = pack_old_row_for_update(&old_prim_row, old_row, primary_key); error = pack_old_row_for_update(&old_prim_row, old_row, primary_key);
if (error) { goto cleanup; } if (error) { goto cleanup; }
set_main_dict_put_flags(thd, &mult_put_flags[primary_key], false); set_main_dict_put_flags(thd, &mult_put_flags[primary_key]);
error = db_env->update_multiple( error = db_env->update_multiple(
db_env, db_env,
......
...@@ -387,7 +387,8 @@ class ha_tokudb : public handler { ...@@ -387,7 +387,8 @@ class ha_tokudb : public handler {
int is_index_unique(bool* is_unique, DB_TXN* txn, DB* db, KEY* key_info); int is_index_unique(bool* is_unique, DB_TXN* txn, DB* db, KEY* key_info);
int is_val_unique(bool* is_unique, uchar* record, KEY* key_info, uint dict_index, DB_TXN* txn); int is_val_unique(bool* is_unique, uchar* record, KEY* key_info, uint dict_index, DB_TXN* txn);
int do_uniqueness_checks(uchar* record, DB_TXN* txn, THD* thd); int do_uniqueness_checks(uchar* record, DB_TXN* txn, THD* thd);
void set_main_dict_put_flags(THD* thd, u_int32_t* put_flags, bool no_overwrite_no_error_allowed); // XXX 3414 remove last parameter
void set_main_dict_put_flags(THD* thd, u_int32_t* put_flags);
int insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk_val, DB_TXN* txn); int insert_row_to_main_dictionary(uchar* record, DBT* pk_key, DBT* pk_val, DB_TXN* txn);
int insert_rows_to_dictionaries_mult(DBT* pk_key, DBT* pk_val, DB_TXN* txn, THD* thd); int insert_rows_to_dictionaries_mult(DBT* pk_key, DBT* pk_val, DB_TXN* txn, THD* thd);
void test_row_packing(uchar* record, DBT* pk_key, DBT* pk_val); void test_row_packing(uchar* record, DBT* pk_key, DBT* pk_val);
......
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
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