Commit 510d048b authored by Neeraj Bisht's avatar Neeraj Bisht

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.
parents 5f37d738 bdb4104c
...@@ -4023,7 +4023,8 @@ longlong Item_func_last_insert_id::val_int() ...@@ -4023,7 +4023,8 @@ longlong Item_func_last_insert_id::val_int()
thd->first_successful_insert_id_in_prev_stmt= value; thd->first_successful_insert_id_in_prev_stmt= value;
return 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: ...@@ -1130,6 +1130,7 @@ public:
const char *func_name() const { return "last_insert_id"; } const char *func_name() const { return "last_insert_id"; }
void fix_length_and_dec() void fix_length_and_dec()
{ {
unsigned_flag= TRUE;
if (arg_count) if (arg_count)
max_length= args[0]->max_length; max_length= args[0]->max_length;
} }
......
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