mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
d10c42b425
Assertion `!pk->has_virtual()' failed in dict_index_build_internal_clust while creating PRIMARY key longer than possible to store in the page. This happened because the key was wrongly deduced as Long UNIQUE supported, however PRIMARY KEY cannot be of that type. The main reason is that only 8 bytes are used to store the hash, see HA_HASH_FIELD_LENGTH. This is also why HA_NOSAME flag is removed (and caused the assertion in turn) in open_table_from_share: if (key_info->algorithm == HA_KEY_ALG_LONG_HASH) { key_part_end++; key_info->flags&= ~HA_NOSAME; } To make it unique, the additional check is done by check_duplicate_long_entries call from ha_write_row, and similar one from ha_update_row. PRIMARY key is already forbidden, which is checked by the first test in main.long_unique, however is_hash_field_needed was wrongly deduced to true in mysql_prepare_create_table in this particular case. FIX: * Improve the check for Key::PRIMARY type * Simplify is_hash_field_needed deduction for a more neat reading
136 lines
3.5 KiB
Text
136 lines
3.5 KiB
Text
create table t1(a blob unique) engine= InnoDB;
|
|
insert into t1 values('RUC');
|
|
insert into t1 values ('RUC');
|
|
ERROR 23000: Duplicate entry 'RUC' for key 'a'
|
|
drop table t1;
|
|
create table t1 (a blob unique , c int unique) engine=innodb;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` blob DEFAULT NULL,
|
|
`c` int(11) DEFAULT NULL,
|
|
UNIQUE KEY `c` (`c`),
|
|
UNIQUE KEY `a` (`a`) USING HASH
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
|
drop table t1;
|
|
#test for concurrent insert of long unique in innodb
|
|
create table t1(a blob unique) engine= InnoDB;
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` blob DEFAULT NULL,
|
|
UNIQUE KEY `a` (`a`) USING HASH
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
|
connect 'con1', localhost, root,,;
|
|
connect 'con2', localhost, root,,;
|
|
connection con1;
|
|
set innodb_lock_wait_timeout= 2;
|
|
set transaction isolation level READ UNCOMMITTED;
|
|
start transaction;
|
|
insert into t1 values('RUC');
|
|
connection con2;
|
|
set innodb_lock_wait_timeout= 2;
|
|
set transaction isolation level READ UNCOMMITTED;
|
|
start transaction;
|
|
insert into t1 values ('RUC');
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
connection con1;
|
|
commit;
|
|
set transaction isolation level READ COMMITTED;
|
|
start transaction;
|
|
insert into t1 values('RC');
|
|
connection con2;
|
|
commit;
|
|
set transaction isolation level READ COMMITTED;
|
|
start transaction;
|
|
insert into t1 values ('RC');
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
commit;
|
|
connection con1;
|
|
commit;
|
|
set transaction isolation level REPEATABLE READ;
|
|
start transaction;
|
|
insert into t1 values('RR');
|
|
connection con2;
|
|
commit;
|
|
set transaction isolation level REPEATABLE READ;
|
|
start transaction;
|
|
insert into t1 values ('RR');
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
connection con1;
|
|
commit;
|
|
set transaction isolation level SERIALIZABLE;
|
|
start transaction;
|
|
insert into t1 values('S');
|
|
connection con2;
|
|
commit;
|
|
set transaction isolation level SERIALIZABLE;
|
|
start transaction;
|
|
insert into t1 values ('S');
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
commit;
|
|
connection con1;
|
|
commit;
|
|
select * from t1;
|
|
a
|
|
RUC
|
|
RC
|
|
RR
|
|
S
|
|
drop table t1;
|
|
create table t1(a blob unique) engine=Innodb;
|
|
connection con1;
|
|
set transaction isolation level READ UNCOMMITTED;
|
|
start transaction;
|
|
insert into t1 values('RUC');
|
|
connection con2;
|
|
set transaction isolation level READ UNCOMMITTED;
|
|
start transaction;
|
|
insert into t1 values ('RUC');;
|
|
connection con1;
|
|
rollback;
|
|
connection con2;
|
|
commit;
|
|
connection con1;
|
|
set transaction isolation level READ COMMITTED;
|
|
start transaction;
|
|
insert into t1 values('RC');
|
|
connection con2;
|
|
set transaction isolation level READ COMMITTED;
|
|
start transaction;
|
|
insert into t1 values ('RC');;
|
|
connection con1;
|
|
rollback;
|
|
connection con2;
|
|
commit;
|
|
connection con1;
|
|
set transaction isolation level REPEATABLE READ;
|
|
start transaction;
|
|
insert into t1 values('RR');
|
|
connection con2;
|
|
set transaction isolation level REPEATABLE READ;
|
|
start transaction;
|
|
insert into t1 values ('RR');;
|
|
connection con1;
|
|
rollback;
|
|
connection con2;
|
|
commit;
|
|
connection con1;
|
|
set transaction isolation level SERIALIZABLE;
|
|
start transaction;
|
|
insert into t1 values('S');
|
|
connection con2;
|
|
set transaction isolation level SERIALIZABLE;
|
|
start transaction;
|
|
insert into t1 values ('S');;
|
|
connection con1;
|
|
rollback;
|
|
connection con2;
|
|
commit;
|
|
connection default;
|
|
drop table t1;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
# MDEV-20131 Assertion `!pk->has_virtual()' failed
|
|
create table t1 (a text, primary key(a(1871))) engine=innodb;
|
|
ERROR 42000: Specified key was too long; max key length is 1536 bytes
|