diff options
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | include/my_handler.h | 5 | ||||
-rw-r--r-- | mysql-test/r/type_bit.result | 21 | ||||
-rw-r--r-- | mysql-test/t/type_bit.test | 22 | ||||
-rw-r--r-- | sql/key.cc | 6 | ||||
-rw-r--r-- | sql/unireg.cc | 21 |
6 files changed, 59 insertions, 17 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 346dcae3cfd..0ddc8b2d996 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -217,6 +217,7 @@ ram@deer.(none) ram@gw.mysql.r18.ru ram@gw.udmsearch.izhnet.ru ram@mysql.r18.ru +ram@ram-book.(none) ram@ram.(none) ramil@mysql.com ranger@regul.home.lan diff --git a/include/my_handler.h b/include/my_handler.h index cad15d5471f..c076ba0c2c9 100644 --- a/include/my_handler.h +++ b/include/my_handler.h @@ -72,10 +72,11 @@ typedef struct st_HA_KEYSEG /* Key-portion */ #define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \ { \ - (bit_ptr)[0]= ((bit_ptr)[0] & ((1 << (bit_ofs)) - 1)) | \ + (bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \ ((bits) << (bit_ofs)); \ if ((bit_ofs) + (bit_len) > 8) \ - (bit_ptr)[1]= ((bits) & ((1 << (bit_len)) - 1)) >> (8 - (bit_ofs)); \ + (bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \ + ((bits) >> (8 - (bit_ofs))); \ } #define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \ diff --git a/mysql-test/r/type_bit.result b/mysql-test/r/type_bit.result index b0cd4150c9d..64c9a11b3cd 100644 --- a/mysql-test/r/type_bit.result +++ b/mysql-test/r/type_bit.result @@ -437,3 +437,24 @@ a+0 b+0 2303 2 12345 4 drop table t1, t2; +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), +g bit(1) NOT NULL default 1, h char(1) default 'a'); +insert into t1 set a=1; +select hex(g), h from t1; +hex(g) h +1 a +drop table t1; +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), +g bit(1) NOT NULL default 1); +insert into t1 set a=1; +select hex(g) from t1; +hex(g) +1 +drop table t1; +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), +h char(1) default 'a') engine=myisam; +insert into t1 set a=1; +select h from t1; +h +a +drop table t1; diff --git a/mysql-test/t/type_bit.test b/mysql-test/t/type_bit.test index 1fbcf01d5a6..19d16f95990 100644 --- a/mysql-test/t/type_bit.test +++ b/mysql-test/t/type_bit.test @@ -140,3 +140,25 @@ drop table t1; create table t1 select * from t2; select a+0, b+0 from t1; drop table t1, t2; + +# +# Bug #10179: problem with NULLs and default values +# + +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), + g bit(1) NOT NULL default 1, h char(1) default 'a'); +insert into t1 set a=1; +select hex(g), h from t1; +drop table t1; + +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), + g bit(1) NOT NULL default 1); +insert into t1 set a=1; +select hex(g) from t1; +drop table t1; + +create table t1 (a int, b time, c tinyint, d bool, e char(10), f bit(1), + h char(1) default 'a') engine=myisam; +insert into t1 set a=1; +select h from t1; +drop table t1; diff --git a/sql/key.cc b/sql/key.cc index 3299c3db8f8..4bd71d2fa47 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -197,12 +197,6 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info, (key_part->null_bit == 128), field->bit_ofs, field->bit_len); } - else - { - clr_rec_bits(to_record + key_part->null_offset + - (key_part->null_bit == 128), - field->bit_ofs, field->bit_len); - } } if (key_part->key_part_flag & HA_BLOB_PART) { diff --git a/sql/unireg.cc b/sql/unireg.cc index 95a383e0f01..e29b97a3f03 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -647,7 +647,7 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, { int error; Field::utype type; - uint firstpos,null_count,null_length; + uint null_count; uchar *buff,*null_pos; TABLE table; create_field *field; @@ -671,15 +671,14 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, table.s->db_low_byte_first= handler->low_byte_first(); table.s->blob_ptr_size= portable_sizeof_char_ptr; - firstpos=reclength; null_count=0; if (!(table_options & HA_OPTION_PACK_RECORD)) { null_fields++; // Need one bit for delete mark null_count++; + *buff|= 1; } - bfill(buff,(null_length=(null_fields+7)/8),255); - null_pos= buff + null_count / 8; + null_pos= buff; List_iterator<create_field> it(create_fields); thd->count_cuted_fields= CHECK_FIELD_WARN; // To find wrong default values @@ -689,7 +688,7 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, regfield don't have to be deleted as it's allocated with sql_alloc() */ Field *regfield=make_field((char*) buff+field->offset,field->length, - null_pos, + null_pos + null_count / 8, null_count & 7, field->pack_flag, field->sql_type, @@ -703,11 +702,13 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, goto err; // End of memory if (!(field->flags & NOT_NULL_FLAG)) + { + *regfield->null_ptr|= regfield->null_bit; null_count++; + } - if ((uint) field->offset < firstpos && - regfield->type() != FIELD_TYPE_NULL) - firstpos= field->offset; + if (field->sql_type == FIELD_TYPE_BIT && !f_bit_as_char(field->pack_flag)) + null_count+= field->length & 7; type= (Field::utype) MTYP_TYPENR(field->unireg_check); @@ -737,7 +738,9 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, } /* Fill not used startpos */ - bfill((byte*) buff+null_length,firstpos-null_length,255); + if (null_count) + *(null_pos + null_count / 8)|= ~(((uchar) 1 << (null_count & 7)) - 1); + error=(int) my_write(file,(byte*) buff,(uint) reclength,MYF_RW); err: |