Commit c55aadd5 authored by Rich Prohaska's avatar Rich Prohaska

#159 set last_auto_increment from create info

parent d22b6118
...@@ -7410,61 +7410,49 @@ ha_rows ha_tokudb::records_in_range(uint keynr, key_range* start_key, key_range* ...@@ -7410,61 +7410,49 @@ ha_rows ha_tokudb::records_in_range(uint keynr, key_range* start_key, key_range*
// auto-increment field (if auto-increment field is the first field of a key). // auto-increment field (if auto-increment field is the first field of a key).
// //
void ha_tokudb::init_auto_increment() { void ha_tokudb::init_auto_increment() {
DBT key;
DBT value;
int error; int error;
HA_METADATA_KEY key_val = hatoku_max_ai;
memset(&key, 0, sizeof(key));
memset(&value, 0, sizeof(value));
key.data = &key_val;
key.size = sizeof(key_val);
value.flags = DB_DBT_USERMEM;
DB_TXN* txn = NULL; DB_TXN* txn = NULL;
error = txn_begin(db_env, 0, &txn, 0, ha_thd()); error = txn_begin(db_env, 0, &txn, 0, ha_thd());
if (error) { if (error) {
share->last_auto_increment = 0; share->last_auto_increment = 0;
} } else {
else { HA_METADATA_KEY key_val;
// DBT key;
// First retrieve hatoku_max_ai, which is max value used by auto increment memset(&key, 0, sizeof(key));
// column so far, the max value could have been auto generated (e.g. insert (NULL)) key.data = &key_val;
// or it could have been manually inserted by user (e.g. insert (345)) key.size = sizeof(key_val);
// DBT value;
value.ulen = sizeof(share->last_auto_increment); memset(&value, 0, sizeof(value));
value.data = &share->last_auto_increment; value.flags = DB_DBT_USERMEM;
error = share->status_block->get(
share->status_block,
txn,
&key,
&value,
0
);
if (error || value.size != sizeof(share->last_auto_increment)) {
share->last_auto_increment = 0;
}
// // Retrieve the initial auto increment value, as specified by create table
// Now retrieve the initial auto increment value, as specified by create table
// so if a user does "create table t1 (a int auto_increment, primary key (a)) auto_increment=100", // so if a user does "create table t1 (a int auto_increment, primary key (a)) auto_increment=100",
// then the value 100 should be stored here // then the value 100 should be stored here
//
key_val = hatoku_ai_create_value; key_val = hatoku_ai_create_value;
value.ulen = sizeof(share->auto_inc_create_value); value.ulen = sizeof(share->auto_inc_create_value);
value.data = &share->auto_inc_create_value; value.data = &share->auto_inc_create_value;
error = share->status_block->get( error = share->status_block->get(share->status_block, txn, &key, &value, 0);
share->status_block,
txn,
&key,
&value,
0
);
if (error || value.size != sizeof(share->auto_inc_create_value)) { if (error || value.size != sizeof(share->auto_inc_create_value)) {
share->auto_inc_create_value = 0; share->auto_inc_create_value = 0;
} }
// Retrieve hatoku_max_ai, which is max value used by auto increment
// column so far, the max value could have been auto generated (e.g. insert (NULL))
// or it could have been manually inserted by user (e.g. insert (345))
key_val = hatoku_max_ai;
value.ulen = sizeof(share->last_auto_increment);
value.data = &share->last_auto_increment;
error = share->status_block->get(share->status_block, txn, &key, &value, 0);
if (error || value.size != sizeof(share->last_auto_increment)) {
if (share->auto_inc_create_value)
share->last_auto_increment = share->auto_inc_create_value - 1;
else
share->last_auto_increment = 0;
}
commit_txn(txn, 0); commit_txn(txn, 0);
} }
if (tokudb_debug & TOKUDB_DEBUG_AUTO_INCREMENT) { if (tokudb_debug & TOKUDB_DEBUG_AUTO_INCREMENT) {
......
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