ndb_auto_increment.result:

  Rename: mysql-test/r/ndb_auto_increment.result -> mysql-test/suite/ndb/r/ndb_auto_increment.result
ndb_auto_increment.test, ndb_auto_increment.result:
  Bug #31956       auto increment bugs in MySQL Cluster: Adapted test cases
ha_ndbcluster.cc:
  Bug #31956       auto increment bugs in MySQL Cluster: Merging from 5.0
ndb_auto_increment.test:
  Rename: mysql-test/t/ndb_auto_increment.test -> mysql-test/suite/ndb/t/ndb_auto_increment.test
parent 310d5923
...@@ -416,7 +416,7 @@ a ...@@ -416,7 +416,7 @@ a
insert into t1 values (35); insert into t1 values (35);
insert into t1 values (NULL); insert into t1 values (NULL);
insert into t1 values (NULL); insert into t1 values (NULL);
ERROR 23000: Duplicate entry '35' for key 1 ERROR 23000: Duplicate entry '35' for key 'PRIMARY'
select * from t1 order by a; select * from t1 order by a;
a a
1 1
......
-- source include/have_ndb.inc
-- source include/have_multi_ndb.inc -- source include/have_multi_ndb.inc
-- source include/not_embedded.inc -- source include/not_embedded.inc
......
...@@ -2704,6 +2704,29 @@ int ha_ndbcluster::full_table_scan(uchar *buf) ...@@ -2704,6 +2704,29 @@ int ha_ndbcluster::full_table_scan(uchar *buf)
DBUG_RETURN(next_result(buf)); DBUG_RETURN(next_result(buf));
} }
int
ha_ndbcluster::set_auto_inc(Field *field)
{
DBUG_ENTER("ha_ndbcluster::set_auto_inc");
Ndb *ndb= get_ndb();
bool read_bit= bitmap_is_set(table->read_set, field->field_index);
bitmap_set_bit(table->read_set, field->field_index);
Uint64 next_val= (Uint64) field->val_int() + 1;
if (!read_bit)
bitmap_clear_bit(table->read_set, field->field_index);
#ifndef DBUG_OFF
char buff[22];
DBUG_PRINT("info",
("Trying to set next auto increment value to %s",
llstr(next_val, buff)));
#endif
Ndb_tuple_id_range_guard g(m_share);
if (ndb->setAutoIncrementValue(m_table, g.range, next_val, TRUE)
== -1)
ERR_RETURN(ndb->getNdbError());
DBUG_RETURN(0);
}
/* /*
Insert one record into NDB Insert one record into NDB
*/ */
...@@ -2910,18 +2933,11 @@ int ha_ndbcluster::write_row(uchar *record) ...@@ -2910,18 +2933,11 @@ int ha_ndbcluster::write_row(uchar *record)
} }
if ((has_auto_increment) && (m_skip_auto_increment)) if ((has_auto_increment) && (m_skip_auto_increment))
{ {
Ndb *ndb= get_ndb(); int ret_val;
Uint64 next_val= (Uint64) table->next_number_field->val_int() + 1; if ((ret_val= set_auto_inc(table->next_number_field)))
#ifndef DBUG_OFF {
char buff[22]; DBUG_RETURN(ret_val);
DBUG_PRINT("info", }
("Trying to set next auto increment value to %s",
llstr(next_val, buff)));
#endif
Ndb_tuple_id_range_guard g(m_share);
if (ndb->setAutoIncrementValue(m_table, g.range, next_val, TRUE)
== -1)
ERR_RETURN(ndb->getNdbError());
} }
m_skip_auto_increment= TRUE; m_skip_auto_increment= TRUE;
...@@ -3046,6 +3062,17 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data) ...@@ -3046,6 +3062,17 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data)
// Insert new row // Insert new row
DBUG_PRINT("info", ("delete succeded")); DBUG_PRINT("info", ("delete succeded"));
m_primary_key_update= TRUE; m_primary_key_update= TRUE;
/*
If we are updating a primary key with auto_increment
then we need to update the auto_increment counter
*/
if (table->found_next_number_field &&
bitmap_is_set(table->write_set,
table->found_next_number_field->field_index) &&
(error= set_auto_inc(table->found_next_number_field)))
{
DBUG_RETURN(error);
}
insert_res= write_row(new_data); insert_res= write_row(new_data);
m_primary_key_update= FALSE; m_primary_key_update= FALSE;
if (insert_res) if (insert_res)
...@@ -3068,7 +3095,17 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data) ...@@ -3068,7 +3095,17 @@ int ha_ndbcluster::update_row(const uchar *old_data, uchar *new_data)
DBUG_PRINT("info", ("delete+insert succeeded")); DBUG_PRINT("info", ("delete+insert succeeded"));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/*
If we are updating a unique key with auto_increment
then we need to update the auto_increment counter
*/
if (table->found_next_number_field &&
bitmap_is_set(table->write_set,
table->found_next_number_field->field_index) &&
(error= set_auto_inc(table->found_next_number_field)))
{
DBUG_RETURN(error);
}
if (cursor) if (cursor)
{ {
/* /*
...@@ -4478,9 +4515,11 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb) ...@@ -4478,9 +4515,11 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb)
// store thread specific data first to set the right context // store thread specific data first to set the right context
m_force_send= thd->variables.ndb_force_send; m_force_send= thd->variables.ndb_force_send;
m_ha_not_exact_count= !thd->variables.ndb_use_exact_count; m_ha_not_exact_count= !thd->variables.ndb_use_exact_count;
m_autoincrement_prefetch= m_autoincrement_prefetch=
(ha_rows) thd->variables.ndb_autoincrement_prefetch_sz; (thd->variables.ndb_autoincrement_prefetch_sz >
NDB_DEFAULT_AUTO_PREFETCH) ?
(ha_rows) thd->variables.ndb_autoincrement_prefetch_sz
: (ha_rows) NDB_DEFAULT_AUTO_PREFETCH;
m_active_trans= thd_ndb->trans; m_active_trans= thd_ndb->trans;
DBUG_ASSERT(m_active_trans); DBUG_ASSERT(m_active_trans);
// Start of transaction // Start of transaction
...@@ -6163,8 +6202,9 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, ...@@ -6163,8 +6202,9 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment,
ulonglong *first_value, ulonglong *first_value,
ulonglong *nb_reserved_values) ulonglong *nb_reserved_values)
{ {
int cache_size; uint cache_size;
Uint64 auto_value; Uint64 auto_value;
THD *thd= current_thd;
DBUG_ENTER("get_auto_increment"); DBUG_ENTER("get_auto_increment");
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
Ndb *ndb= get_ndb(); Ndb *ndb= get_ndb();
...@@ -6174,11 +6214,14 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, ...@@ -6174,11 +6214,14 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment,
/* We guessed too low */ /* We guessed too low */
m_rows_to_insert+= m_autoincrement_prefetch; m_rows_to_insert+= m_autoincrement_prefetch;
} }
cache_size= uint remaining= m_rows_to_insert - m_rows_inserted;
(int) ((m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ? uint min_prefetch=
m_rows_to_insert - m_rows_inserted : (remaining < thd->variables.ndb_autoincrement_prefetch_sz) ?
((m_rows_to_insert > m_autoincrement_prefetch) ? thd->variables.ndb_autoincrement_prefetch_sz
m_rows_to_insert : m_autoincrement_prefetch)); : remaining;
cache_size= ((remaining < m_autoincrement_prefetch) ?
min_prefetch
: remaining);
uint retries= NDB_AUTO_INCREMENT_RETRIES; uint retries= NDB_AUTO_INCREMENT_RETRIES;
int retry_sleep= 30; /* 30 milliseconds, transaction */ int retry_sleep= 30; /* 30 milliseconds, transaction */
for (;;) for (;;)
...@@ -6265,7 +6308,7 @@ ha_ndbcluster::ha_ndbcluster(handlerton *hton, TABLE_SHARE *table_arg): ...@@ -6265,7 +6308,7 @@ ha_ndbcluster::ha_ndbcluster(handlerton *hton, TABLE_SHARE *table_arg):
m_dupkey((uint) -1), m_dupkey((uint) -1),
m_ha_not_exact_count(FALSE), m_ha_not_exact_count(FALSE),
m_force_send(TRUE), m_force_send(TRUE),
m_autoincrement_prefetch((ha_rows) 32), m_autoincrement_prefetch((ha_rows) NDB_DEFAULT_AUTO_PREFETCH),
m_transaction_on(TRUE), m_transaction_on(TRUE),
m_cond(NULL), m_cond(NULL),
m_multi_cursor(NULL) m_multi_cursor(NULL)
......
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