Hello Sergei!

> +# AUTO_INCREMENT field is both standalone and in WITHOUT OVERLAPS
> +create or replace table cars(id int primary key auto_increment,
> +price int, s date, e date,
> +period for p(s,e),
> +unique(id, p without overlaps));
> +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01');
> +select * from cars;
> +id   price   s       e
> +1    1000    2018-01-01      2020-01-01
> +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100;
> +ERROR 23000: Duplicate entry '1' for key 'PRIMARY'

uhm, I don't know. I'd expect that here PRIMARY would define
autoincrement values.

> +truncate cars;
> +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01');
> +delete from cars for portion of p from '2019-12-10' to '2019-12-20';
> +ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
> +# AUTO_INCREMENT field is non-unique

not sure here. I think here unique should define autoincrement values.
That is, in both cases, the most restrictive index should define.
> +void TABLE::period_prepare_autoinc()
> +{
> +  if (!found_next_number_field)
> +    return;
> + 
> +  key_map::Iterator it(found_next_number_field->part_of_key_not_clustered);
> +  for (uint i; (i= it++) != key_map::Iterator::BITMAP_END;)
> +  {
> +    KEY &key= key_info[i];
> +    if (key.without_overlaps)
> +      return;
> +  }

No, I don't think you need to check *all* indexes that the field is part
of. I believe you should only check the "main" index, the one that
defines autoincrement field behavior. That is only

  if (key_info[s->next_number_index].without_overlaps)
    return;

I don't understand the notion of the "autoincrement index". Why any index is important at all for an autoincrement field?

Other than that, if next_number_index means the most restrictive one, it may make sense.

 
--
Yours truly,
Nikita Malyavin