diff options
author | unknown <tsmith@rhel5-ia64-a.mysql.com> | 2008-03-27 08:41:25 +0100 |
---|---|---|
committer | unknown <tsmith@rhel5-ia64-a.mysql.com> | 2008-03-27 08:41:25 +0100 |
commit | f676e12268ef356cdc6036126770e7f5f14496ed (patch) | |
tree | de4583519fceb1b1b69e5d9be7146e4ca4e63d83 /storage | |
parent | 45ebe9953385f48f99058eaedf448bb6ff8caeaa (diff) | |
parent | 9aaab69ab104a9c6d72a66d2de66833f36e6042e (diff) | |
download | mariadb-git-f676e12268ef356cdc6036126770e7f5f14496ed.tar.gz |
Merge rhel5-ia64-a.mysql.com:/data0/tsmith/51
into rhel5-ia64-a.mysql.com:/data0/tsmith/build/51
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innobase/dict/dict0dict.c | 6 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 59 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.h | 2 | ||||
-rw-r--r-- | storage/innobase/include/dict0dict.h | 6 | ||||
-rw-r--r-- | storage/innobase/include/dict0mem.h | 2 | ||||
-rw-r--r-- | storage/innobase/include/row0sel.h | 2 | ||||
-rw-r--r-- | storage/innobase/include/univ.i | 3 | ||||
-rw-r--r-- | storage/innobase/row/row0sel.c | 10 |
8 files changed, 60 insertions, 30 deletions
diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c index 8aba5ac1c85..10cef688705 100644 --- a/storage/innobase/dict/dict0dict.c +++ b/storage/innobase/dict/dict0dict.c @@ -429,7 +429,7 @@ void dict_table_autoinc_initialize( /*==========================*/ dict_table_t* table, /* in: table */ - ib_longlong value) /* in: next value to assign to a row */ + ib_ulonglong value) /* in: next value to assign to a row */ { ut_ad(mutex_own(&table->autoinc_mutex)); @@ -441,7 +441,7 @@ dict_table_autoinc_initialize( Reads the next autoinc value (== autoinc counter value), 0 if not yet initialized. */ -ib_longlong +ib_ulonglong dict_table_autoinc_read( /*====================*/ /* out: value for a new row, or 0 */ @@ -470,7 +470,7 @@ dict_table_autoinc_update( /*======================*/ dict_table_t* table, /* in: table */ - ib_longlong value) /* in: value which was assigned to a row */ + ib_ulonglong value) /* in: value which was assigned to a row */ { if (table->autoinc_inited && value > table->autoinc) { diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index f81804c0701..a181ecf1612 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -3545,7 +3545,19 @@ no_commit: if (auto_inc > prebuilt->last_value) { set_max_autoinc: ut_a(prebuilt->table->autoinc_increment > 0); - auto_inc += prebuilt->table->autoinc_increment; + + ulonglong have; + ulonglong need; + + /* Check for overflow conditions. */ + need = prebuilt->table->autoinc_increment; + have = ~0x0ULL - auto_inc; + + if (have < need) { + need = have; + } + + auto_inc += need; err = innobase_set_max_autoinc(auto_inc); @@ -5105,8 +5117,15 @@ ha_innobase::create( DBUG_ASSERT(innobase_table != 0); - if ((create_info->used_fields & HA_CREATE_USED_AUTO) && - (create_info->auto_increment_value != 0)) { + /* Note: We can't call update_thd() as prebuilt will not be + setup at this stage and so we use thd. */ + + /* We need to copy the AUTOINC value from the old table if + this is an ALTER TABLE. */ + + if (((create_info->used_fields & HA_CREATE_USED_AUTO) + || thd_sql_command(thd) == SQLCOM_ALTER_TABLE) + && create_info->auto_increment_value != 0) { /* Query was ALTER TABLE...AUTO_INCREMENT = x; or CREATE TABLE ...AUTO_INCREMENT = x; Find out a table @@ -5856,7 +5875,7 @@ ha_innobase::info( } if (flag & HA_STATUS_AUTO && table->found_next_number_field) { - longlong auto_inc; + ulonglong auto_inc; int ret; /* The following function call can the first time fail in @@ -7207,9 +7226,9 @@ ha_innobase::innobase_read_and_init_auto_inc( /*=========================================*/ /* out: 0 or generic MySQL error code */ - longlong* value) /* out: the autoinc value */ + ulonglong* value) /* out: the autoinc value */ { - longlong auto_inc; + ulonglong auto_inc; ibool stmt_start; int mysql_error = 0; dict_table_t* innodb_table = prebuilt->table; @@ -7260,7 +7279,9 @@ ha_innobase::innobase_read_and_init_auto_inc( index, autoinc_col_name, &auto_inc); if (error == DB_SUCCESS) { - ++auto_inc; + if (auto_inc < ~0x0ULL) { + ++auto_inc; + } dict_table_autoinc_initialize(innodb_table, auto_inc); } else { ut_print_timestamp(stderr); @@ -7313,14 +7334,14 @@ ha_innobase::innobase_get_auto_increment( error = innobase_autoinc_lock(); if (error == DB_SUCCESS) { - ib_longlong autoinc; + ulonglong autoinc; /* Determine the first value of the interval */ autoinc = dict_table_autoinc_read(prebuilt->table); /* We need to initialize the AUTO-INC value, for that we release all locks.*/ - if (autoinc <= 0) { + if (autoinc == 0) { trx_t* trx; trx = prebuilt->trx; @@ -7339,14 +7360,11 @@ ha_innobase::innobase_get_auto_increment( mysql_error = innobase_read_and_init_auto_inc( &autoinc); - if (!mysql_error) { - /* Should have read the proper value */ - ut_a(autoinc > 0); - } else { + if (mysql_error) { error = DB_ERROR; } } else { - *value = (ulonglong) autoinc; + *value = autoinc; } /* A deadlock error during normal processing is OK and can be ignored. */ @@ -7431,10 +7449,19 @@ ha_innobase::get_auto_increment( /* With old style AUTOINC locking we only update the table's AUTOINC counter after attempting to insert the row. */ if (innobase_autoinc_lock_mode != AUTOINC_OLD_STYLE_LOCKING) { + ulonglong have; + ulonglong need; + + /* Check for overflow conditions. */ + need = *nb_reserved_values * increment; + have = ~0x0ULL - *first_value; + + if (have < need) { + need = have; + } /* Compute the last value in the interval */ - prebuilt->last_value = *first_value + - (*nb_reserved_values * increment); + prebuilt->last_value = *first_value + need; ut_a(prebuilt->last_value >= *first_value); diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 773884b6584..4ffcdb1e3c2 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -72,7 +72,7 @@ class ha_innobase: public handler int update_thd(THD* thd); int change_active_index(uint keynr); int general_fetch(uchar* buf, uint direction, uint match_mode); - int innobase_read_and_init_auto_inc(longlong* ret); + int innobase_read_and_init_auto_inc(ulonglong* ret); ulong innobase_autoinc_lock(); ulong innobase_set_max_autoinc(ulonglong auto_inc); ulong innobase_reset_autoinc(ulonglong auto_inc); diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 2f038b21e8e..f60775c8c2f 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -185,12 +185,12 @@ void dict_table_autoinc_initialize( /*==========================*/ dict_table_t* table, /* in: table */ - ib_longlong value); /* in: next value to assign to a row */ + ib_ulonglong value); /* in: next value to assign to a row */ /************************************************************************ Reads the next autoinc value (== autoinc counter value), 0 if not yet initialized. */ -ib_longlong +ib_ulonglong dict_table_autoinc_read( /*====================*/ /* out: value for a new row, or 0 */ @@ -204,7 +204,7 @@ dict_table_autoinc_update( /*======================*/ dict_table_t* table, /* in: table */ - ib_longlong value); /* in: value which was assigned to a row */ + ib_ulonglong value); /* in: value which was assigned to a row */ /************************************************************************ Release the autoinc lock.*/ diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index a05bc513efd..2fe72498989 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -409,7 +409,7 @@ struct dict_table_struct{ /* TRUE if the autoinc counter has been inited; MySQL gets the init value by executing SELECT MAX(auto inc column) */ - ib_longlong autoinc;/* autoinc counter value to give to the + ib_ulonglong autoinc;/* autoinc counter value to give to the next inserted row */ ib_longlong autoinc_increment; diff --git a/storage/innobase/include/row0sel.h b/storage/innobase/include/row0sel.h index 4bde648f18e..a0a4ccb973b 100644 --- a/storage/innobase/include/row0sel.h +++ b/storage/innobase/include/row0sel.h @@ -181,7 +181,7 @@ row_search_max_autoinc( error code */ dict_index_t* index, /* in: index to search */ const char* col_name, /* in: autoinc column name */ - ib_longlong* value); /* out: AUTOINC value read */ + ib_ulonglong* value); /* out: AUTOINC value read */ /* A structure for caching column values for prefetched rows */ struct sel_buf_struct{ diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 8163ae16e4e..8ab62e655ff 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -212,8 +212,11 @@ typedef long int lint; #ifdef __WIN__ typedef __int64 ib_longlong; +typedef unsigned __int64 ib_ulonglong; #else +/* Note: longlong and ulonglong come from MySQL headers. */ typedef longlong ib_longlong; +typedef ulonglong ib_ulonglong; #endif typedef unsigned long long int ullint; diff --git a/storage/innobase/row/row0sel.c b/storage/innobase/row/row0sel.c index 29bded114e0..b050838aad2 100644 --- a/storage/innobase/row/row0sel.c +++ b/storage/innobase/row/row0sel.c @@ -4529,7 +4529,7 @@ row_search_check_if_query_cache_permitted( Read the AUTOINC column from the current row. If the value is less than 0 and the type is not unsigned then we reset the value to 0. */ static -ib_longlong +ib_ulonglong row_search_autoinc_read_column( /*===========================*/ /* out: value read from the column */ @@ -4540,7 +4540,7 @@ row_search_autoinc_read_column( { ulint len; const byte* data; - ib_longlong value; + ib_ulonglong value; mem_heap_t* heap = NULL; /* Our requirement is that dest should be word aligned. */ byte dest[sizeof(value)]; @@ -4567,7 +4567,7 @@ row_search_autoinc_read_column( and that dest is word aligned. */ switch (len) { case 8: - value = *(ib_longlong*) dest; + value = *(ib_ulonglong*) dest; break; case 4: @@ -4595,7 +4595,7 @@ row_search_autoinc_read_column( mem_heap_free(heap); } - if (!unsigned_type && value < 0) { + if (!unsigned_type && (ib_longlong) value < 0) { value = 0; } @@ -4634,7 +4634,7 @@ row_search_max_autoinc( column name can't be found in index */ dict_index_t* index, /* in: index to search */ const char* col_name, /* in: name of autoinc column */ - ib_longlong* value) /* out: AUTOINC value read */ + ib_ulonglong* value) /* out: AUTOINC value read */ { ulint i; ulint n_cols; |