Loading .bzrignore +2 −0 Original line number Diff line number Diff line Loading @@ -1068,3 +1068,5 @@ include/check_abi include/mysql_h.ic mysql-test/r/blackhole.log mysql-test/lib/init_db.sql libmysql_r/client_settings.h libmysqld/ha_blackhole.cc myisam/mi_dynrec.c +68 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,29 @@ static int write_dynamic_record(MI_INFO *info, const byte *record, DBUG_ENTER("write_dynamic_record"); flag=0; /* Check if we have enough room for the new record. First we do simplified check to make usual case faster. Then we do more precise check for the space left. Though it still is not absolutely precise, as we always use MI_MAX_DYN_BLOCK_HEADER while it can be less in the most of the cases. */ if (unlikely(info->s->base.max_data_file_length - info->state->data_file_length < reclength + MI_MAX_DYN_BLOCK_HEADER)) { if (info->s->base.max_data_file_length - info->state->data_file_length + info->state->empty - info->state->del * MI_MAX_DYN_BLOCK_HEADER < reclength + MI_MAX_DYN_BLOCK_HEADER) { my_errno=HA_ERR_RECORD_FILE_FULL; DBUG_RETURN(1); } } do { if (_mi_find_writepos(info,reclength,&filepos,&length)) Loading Loading @@ -577,6 +600,51 @@ static int update_dynamic_record(MI_INFO *info, my_off_t filepos, byte *record, DBUG_ENTER("update_dynamic_record"); flag=block_info.second_read=0; /* Check if we have enough room for the record. First we do simplified check to make usual case faster. Then we do more precise check for the space left. Though it still is not absolutely precise, as we always use MI_MAX_DYN_BLOCK_HEADER while it can be less in the most of the cases. */ /* compare with just the reclength as we're going to get some space from the old replaced record */ if (unlikely(info->s->base.max_data_file_length - info->state->data_file_length < reclength)) { /* let's read the old record's block to find out the length of the old record */ if ((error=_mi_get_block_info(&block_info,info->dfile,filepos)) & (BLOCK_DELETED | BLOCK_ERROR | BLOCK_SYNC_ERROR | BLOCK_FATAL_ERROR)) { DBUG_PRINT("error",("Got wrong block info")); if (!(error & BLOCK_FATAL_ERROR)) my_errno=HA_ERR_WRONG_IN_RECORD; goto err; } /* if new record isn't longer, we can go on safely */ if (block_info.rec_len < reclength) { if (info->s->base.max_data_file_length - info->state->data_file_length + info->state->empty - info->state->del * MI_MAX_DYN_BLOCK_HEADER < reclength - block_info.rec_len + MI_MAX_DYN_BLOCK_HEADER) { my_errno=HA_ERR_RECORD_FILE_FULL; goto err; } } block_info.second_read=0; } while (reclength > 0) { if (filepos != info->s->state.dellink) Loading mysql-test/r/almost_full.result 0 → 100644 +29 −0 Original line number Diff line number Diff line drop table if exists t1; set global myisam_data_pointer_size=2; CREATE TABLE t1 (a int auto_increment primary key not null, b longtext) ENGINE=MyISAM; DELETE FROM t1 WHERE a=1 or a=5; INSERT INTO t1 SET b=repeat('a',600); ERROR HY000: The table 't1' is full CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK UPDATE t1 SET b=repeat('a', 800) where a=10; ERROR HY000: The table 't1' is full CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK INSERT INTO t1 SET b=repeat('a',400); CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK DELETE FROM t1 WHERE a=2 or a=6; UPDATE t1 SET b=repeat('a', 600) where a=11; CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK drop table t1; set global myisam_data_pointer_size=default; mysql-test/r/func_str.result +15 −3 Original line number Diff line number Diff line Loading @@ -711,9 +711,9 @@ Warning 1265 Data truncated for column 'format(130,10)' at row 1 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `bin(130)` char(64) NOT NULL default '', `oct(130)` char(64) NOT NULL default '', `conv(130,16,10)` char(64) NOT NULL default '', `bin(130)` char(64) default NULL, `oct(130)` char(64) default NULL, `conv(130,16,10)` char(64) default NULL, `hex(130)` char(6) NOT NULL default '', `char(130)` char(1) NOT NULL default '', `format(130,10)` char(4) NOT NULL default '', Loading Loading @@ -1075,5 +1075,17 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found Warnings: Note 1003 select decode(test.t1.f1,'zxcv') AS `enc` from test.t1 drop table t1; create table t1 (a bigint not null)engine=myisam; insert into t1 set a = 1024*1024*1024*4; delete from t1 order by (inet_ntoa(a)) desc limit 10; drop table t1; create table t1 (a char(36) not null)engine=myisam; insert ignore into t1 set a = ' '; insert ignore into t1 set a = ' '; select * from t1 order by (oct(a)); a drop table t1; End of 4.1 tests mysql-test/r/select.result +8 −0 Original line number Diff line number Diff line Loading @@ -2835,4 +2835,12 @@ FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF 8FFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF drop table t1; CREATE TABLE t1 (c0 int); CREATE TABLE t2 (c0 int); INSERT INTO t1 VALUES(@@connect_timeout); INSERT INTO t2 VALUES(@@connect_timeout); SELECT * FROM t1 JOIN t2 ON t1.c0 = t2.c0 WHERE (t1.c0 <=> @@connect_timeout); c0 c0 X X DROP TABLE t1, t2; End of 4.1 tests Loading
.bzrignore +2 −0 Original line number Diff line number Diff line Loading @@ -1068,3 +1068,5 @@ include/check_abi include/mysql_h.ic mysql-test/r/blackhole.log mysql-test/lib/init_db.sql libmysql_r/client_settings.h libmysqld/ha_blackhole.cc
myisam/mi_dynrec.c +68 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,29 @@ static int write_dynamic_record(MI_INFO *info, const byte *record, DBUG_ENTER("write_dynamic_record"); flag=0; /* Check if we have enough room for the new record. First we do simplified check to make usual case faster. Then we do more precise check for the space left. Though it still is not absolutely precise, as we always use MI_MAX_DYN_BLOCK_HEADER while it can be less in the most of the cases. */ if (unlikely(info->s->base.max_data_file_length - info->state->data_file_length < reclength + MI_MAX_DYN_BLOCK_HEADER)) { if (info->s->base.max_data_file_length - info->state->data_file_length + info->state->empty - info->state->del * MI_MAX_DYN_BLOCK_HEADER < reclength + MI_MAX_DYN_BLOCK_HEADER) { my_errno=HA_ERR_RECORD_FILE_FULL; DBUG_RETURN(1); } } do { if (_mi_find_writepos(info,reclength,&filepos,&length)) Loading Loading @@ -577,6 +600,51 @@ static int update_dynamic_record(MI_INFO *info, my_off_t filepos, byte *record, DBUG_ENTER("update_dynamic_record"); flag=block_info.second_read=0; /* Check if we have enough room for the record. First we do simplified check to make usual case faster. Then we do more precise check for the space left. Though it still is not absolutely precise, as we always use MI_MAX_DYN_BLOCK_HEADER while it can be less in the most of the cases. */ /* compare with just the reclength as we're going to get some space from the old replaced record */ if (unlikely(info->s->base.max_data_file_length - info->state->data_file_length < reclength)) { /* let's read the old record's block to find out the length of the old record */ if ((error=_mi_get_block_info(&block_info,info->dfile,filepos)) & (BLOCK_DELETED | BLOCK_ERROR | BLOCK_SYNC_ERROR | BLOCK_FATAL_ERROR)) { DBUG_PRINT("error",("Got wrong block info")); if (!(error & BLOCK_FATAL_ERROR)) my_errno=HA_ERR_WRONG_IN_RECORD; goto err; } /* if new record isn't longer, we can go on safely */ if (block_info.rec_len < reclength) { if (info->s->base.max_data_file_length - info->state->data_file_length + info->state->empty - info->state->del * MI_MAX_DYN_BLOCK_HEADER < reclength - block_info.rec_len + MI_MAX_DYN_BLOCK_HEADER) { my_errno=HA_ERR_RECORD_FILE_FULL; goto err; } } block_info.second_read=0; } while (reclength > 0) { if (filepos != info->s->state.dellink) Loading
mysql-test/r/almost_full.result 0 → 100644 +29 −0 Original line number Diff line number Diff line drop table if exists t1; set global myisam_data_pointer_size=2; CREATE TABLE t1 (a int auto_increment primary key not null, b longtext) ENGINE=MyISAM; DELETE FROM t1 WHERE a=1 or a=5; INSERT INTO t1 SET b=repeat('a',600); ERROR HY000: The table 't1' is full CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK UPDATE t1 SET b=repeat('a', 800) where a=10; ERROR HY000: The table 't1' is full CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK INSERT INTO t1 SET b=repeat('a',400); CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK DELETE FROM t1 WHERE a=2 or a=6; UPDATE t1 SET b=repeat('a', 600) where a=11; CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check warning Datafile is almost full, 65448 of 65534 used test.t1 check status OK drop table t1; set global myisam_data_pointer_size=default;
mysql-test/r/func_str.result +15 −3 Original line number Diff line number Diff line Loading @@ -711,9 +711,9 @@ Warning 1265 Data truncated for column 'format(130,10)' at row 1 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `bin(130)` char(64) NOT NULL default '', `oct(130)` char(64) NOT NULL default '', `conv(130,16,10)` char(64) NOT NULL default '', `bin(130)` char(64) default NULL, `oct(130)` char(64) default NULL, `conv(130,16,10)` char(64) default NULL, `hex(130)` char(6) NOT NULL default '', `char(130)` char(1) NOT NULL default '', `format(130,10)` char(4) NOT NULL default '', Loading Loading @@ -1075,5 +1075,17 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found Warnings: Note 1003 select decode(test.t1.f1,'zxcv') AS `enc` from test.t1 drop table t1; create table t1 (a bigint not null)engine=myisam; insert into t1 set a = 1024*1024*1024*4; delete from t1 order by (inet_ntoa(a)) desc limit 10; drop table t1; create table t1 (a char(36) not null)engine=myisam; insert ignore into t1 set a = ' '; insert ignore into t1 set a = ' '; select * from t1 order by (oct(a)); a drop table t1; End of 4.1 tests
mysql-test/r/select.result +8 −0 Original line number Diff line number Diff line Loading @@ -2835,4 +2835,12 @@ FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF 8FFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF drop table t1; CREATE TABLE t1 (c0 int); CREATE TABLE t2 (c0 int); INSERT INTO t1 VALUES(@@connect_timeout); INSERT INTO t2 VALUES(@@connect_timeout); SELECT * FROM t1 JOIN t2 ON t1.c0 = t2.c0 WHERE (t1.c0 <=> @@connect_timeout); c0 c0 X X DROP TABLE t1, t2; End of 4.1 tests