maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #12783
Re: b1881e07797: MDEV-20131 Assertion `!pk->has_virtual ()' failed in instant_alter_column_possible
Hi, Sachin!
On Jul 12, Sachin Kumar wrote:
> revision-id: b1881e07797 (mariadb-10.4.20-9-gb1881e07797)
> parent(s): 8a2b4d531dc
> author: Sachin Kumar <sachin.setiya@xxxxxxxxxxx>
> committer: Sachin Kumar <sachin.setiya@xxxxxxxxxxx>
> timestamp: 2021-06-11 14:26:19 +0100
> message:
>
> MDEV-20131 Assertion `!pk->has_virtual ()' failed in instant_alter_column_possible
>
> Problem:- Primary key on long unique columns is not allowed but when
> `CREATE TABLE t2 (a TEXT, PRIMARY KEY(a(1871))) ENGINE=InnoDB;`
> is executed with innodb_page_size=8k or 4k, primary key on DB_ROW_HASH_1 column
> is created. Reason of this is in mysql_prepare_create_table we check against
> max_key_part_length() to see whether key_part length is more then engine supported
> key_part length , and if it is true error is thrown for primary key and long
> unique index is created for unique key. But in this case max_key_part_length()
> returns 3072 which is more the max_key_length() , which later in code triggers
> creating of long unique index.
>
> Solution:- max_supported_key_part_length() should return according to innodb
> page size.
>
> diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
> index ce2e4b6990f..e5e864bffc5 100644
> --- a/storage/innobase/handler/ha_innodb.cc
> +++ b/storage/innobase/handler/ha_innodb.cc
> @@ -6537,14 +6537,21 @@ ha_innobase::clone(
> DBUG_RETURN(new_handler);
> }
>
> -
> -uint
> -ha_innobase::max_supported_key_part_length() const
> -/*==============================================*/
> -{
> - /* A table format specific index column length check will be performed
> - at ha_innobase::add_index() and row_create_index_for_mysql() */
> - return(REC_VERSION_56_MAX_INDEX_COL_LEN);
> +uint ha_innobase::max_supported_key_part_length() const
> +{
> + /* A table format specific index column length check will be performed
> + at ha_innobase::add_index() and row_create_index_for_mysql() */
> + /* FIXME: rewrite this as well as ha_innobase::max_supported_key_length()
> + using an API that considers the PRIMARY KEY as well as secondary index
> + metadata and the ROW_FORMAT and KEY_BLOCK_SIZE */
> + switch (srv_page_size) {
> + case 4096:
> + return 1173;
> + case 8192:
> + return 1536;
> + default:
> + return REC_VERSION_56_MAX_INDEX_COL_LEN;
> + }
dunno, why would you duplicate the whole switch logic?
can you just
- return(REC_VERSION_56_MAX_INDEX_COL_LEN);
- return MY_MIN(max_supported_key_length(), REC_VERSION_56_MAX_INDEX_COL_LEN);
> }
>
> /******************************************************************//**
>
Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx