maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #10695
Re: [Commits] 39bce67: MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff'
Hi Varun,
First reaction:
> diff --git a/sql/sql_table.cc b/sql/sql_table.cc
> index 84e4018..63636f9 100644
> --- a/sql/sql_table.cc
> +++ b/sql/sql_table.cc
> @@ -3948,7 +3948,11 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
> key_part_info->fieldnr= field;
> key_part_info->offset= (uint16) sql_field->offset;
> key_part_info->key_type=sql_field->pack_flag;
> - uint key_part_length= sql_field->key_length;
> + uint key_part_length= MY_MAX(sql_field->key_length,
> + sql_field->pack_length);
What does the above do? It is not clear why MAX should be used. (Let's denote
the compared variables X and Y. Can X>Y and X<Y both happen in practice?
This requires a comment!)
> +
> + if (!(sql_field->flags & NOT_NULL_FLAG))
> + key_part_length++;
>
> if (column->length)
> {
I am concerned that the above may have an undesired effect:
key_part_kength counts NULL-byte while previously it did not.
Let's try this example:
create table t1 (pk int not null primary key, col1 int, key(col1) ) engine=innodb;
Run it, and put a breakpoint below on this code:
/* Check if the key segment is partial, set the key flag accordingly */
if (key_part_length != sql_field->key_length)
key_info->flags|= HA_KEY_HAS_PART_KEY_SEG;
You will see that for filed 'col1' HA_KEY_HAS_PART_KEY_SEG flag is now set.
This didn't happen before. Is this really intended?
I wasn't able to find what exactly may get wrong, but if I run this query:
explain select * from t1 where col1=1;
then it hangs.
BR
Sergei
--
Sergei Petrunia, Software Developer
MariaDB Corporation | Skype: sergefp | Blog: http://s.petrunia.net/blog