Bug#11745891 - LAST_INSERT(ID) DOES NOT SUPPORT BIGINT UNSIGNED
Problem:- using last_insert_id() on an auto_incremented bigint unsigned does not work for values which are greater than max-bigint-signed. Analysis:- last_insert_id() returns the first auto_incremented value for a column and an auto_incremented value can have only positive values. In our code, when we are initializing a last_insert_id object, we are taking it as a signed BIGINT, So when the auto_incremented value reaches greater than max signed bigint, last_insert_id gives negative result. Solution: When we are fetching the value from last_insert_id, We are setting the unsigned_flag, so that it take only unsigned BIGINT value. sql/item_func.cc: here unsigned value is converted to signed value. sql/item_func.h: last_insert_id() gives an auto_incremented value which can be positive only,so defined it as a unsigned longlong sets the unsigned_flag to 1.
This commit is contained in:
commit
510d048b7c
@ -4023,7 +4023,8 @@ longlong Item_func_last_insert_id::val_int()
|
||||
thd->first_successful_insert_id_in_prev_stmt= value;
|
||||
return value;
|
||||
}
|
||||
return thd->read_first_successful_insert_id_in_prev_stmt();
|
||||
return
|
||||
static_cast<longlong>(thd->read_first_successful_insert_id_in_prev_stmt());
|
||||
}
|
||||
|
||||
|
||||
|
@ -1130,6 +1130,7 @@ public:
|
||||
const char *func_name() const { return "last_insert_id"; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
unsigned_flag= TRUE;
|
||||
if (arg_count)
|
||||
max_length= args[0]->max_length;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user