Commit 936c8498 authored by unknown's avatar unknown

A fix (bug #10179: error in default value setting).


include/my_handler.h:
  A fix (bug #10179: error in default value setting).
  Proper masks added: we should not touch extra bits.
sql/key.cc:
  A fix (bug #10179: error in default value setting).
  Unnecessary code removed.
sql/unireg.cc:
  A fix (bug #10179: error in default value setting).
  1. we should take into account uneven bits (for bit fields) stored among NULL bits.
  2. changed code which sets NULL bits for fields.
  3. changed code which sets unused bits after NULL bits.
  4. unused variables removed.
BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
parent a406c034
...@@ -217,6 +217,7 @@ ram@deer.(none) ...@@ -217,6 +217,7 @@ ram@deer.(none)
ram@gw.mysql.r18.ru ram@gw.mysql.r18.ru
ram@gw.udmsearch.izhnet.ru ram@gw.udmsearch.izhnet.ru
ram@mysql.r18.ru ram@mysql.r18.ru
ram@ram-book.(none)
ram@ram.(none) ram@ram.(none)
ramil@mysql.com ramil@mysql.com
ranger@regul.home.lan ranger@regul.home.lan
......
...@@ -72,10 +72,11 @@ typedef struct st_HA_KEYSEG /* Key-portion */ ...@@ -72,10 +72,11 @@ typedef struct st_HA_KEYSEG /* Key-portion */
#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \ #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)); \ ((bits) << (bit_ofs)); \
if ((bit_ofs) + (bit_len) > 8) \ 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) \ #define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \
......
...@@ -437,3 +437,24 @@ a+0 b+0 ...@@ -437,3 +437,24 @@ a+0 b+0
2303 2 2303 2
12345 4 12345 4
drop table t1, t2; 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;
...@@ -140,3 +140,25 @@ drop table t1; ...@@ -140,3 +140,25 @@ drop table t1;
create table t1 select * from t2; create table t1 select * from t2;
select a+0, b+0 from t1; select a+0, b+0 from t1;
drop table t1, t2; 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;
...@@ -197,12 +197,6 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info, ...@@ -197,12 +197,6 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info,
(key_part->null_bit == 128), (key_part->null_bit == 128),
field->bit_ofs, field->bit_len); 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) if (key_part->key_part_flag & HA_BLOB_PART)
{ {
......
...@@ -647,7 +647,7 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, ...@@ -647,7 +647,7 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type,
{ {
int error; int error;
Field::utype type; Field::utype type;
uint firstpos,null_count,null_length; uint null_count;
uchar *buff,*null_pos; uchar *buff,*null_pos;
TABLE table; TABLE table;
create_field *field; create_field *field;
...@@ -671,15 +671,14 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, ...@@ -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->db_low_byte_first= handler->low_byte_first();
table.s->blob_ptr_size= portable_sizeof_char_ptr; table.s->blob_ptr_size= portable_sizeof_char_ptr;
firstpos=reclength;
null_count=0; null_count=0;
if (!(table_options & HA_OPTION_PACK_RECORD)) if (!(table_options & HA_OPTION_PACK_RECORD))
{ {
null_fields++; // Need one bit for delete mark null_fields++; // Need one bit for delete mark
null_count++; null_count++;
*buff|= 1;
} }
bfill(buff,(null_length=(null_fields+7)/8),255); null_pos= buff;
null_pos= buff + null_count / 8;
List_iterator<create_field> it(create_fields); List_iterator<create_field> it(create_fields);
thd->count_cuted_fields= CHECK_FIELD_WARN; // To find wrong default values 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, ...@@ -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() regfield don't have to be deleted as it's allocated with sql_alloc()
*/ */
Field *regfield=make_field((char*) buff+field->offset,field->length, Field *regfield=make_field((char*) buff+field->offset,field->length,
null_pos, null_pos + null_count / 8,
null_count & 7, null_count & 7,
field->pack_flag, field->pack_flag,
field->sql_type, field->sql_type,
...@@ -703,11 +702,13 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type, ...@@ -703,11 +702,13 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type,
goto err; // End of memory goto err; // End of memory
if (!(field->flags & NOT_NULL_FLAG)) if (!(field->flags & NOT_NULL_FLAG))
{
*regfield->null_ptr|= regfield->null_bit;
null_count++; null_count++;
}
if ((uint) field->offset < firstpos && if (field->sql_type == FIELD_TYPE_BIT && !f_bit_as_char(field->pack_flag))
regfield->type() != FIELD_TYPE_NULL) null_count+= field->length & 7;
firstpos= field->offset;
type= (Field::utype) MTYP_TYPENR(field->unireg_check); 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, ...@@ -737,7 +738,9 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type,
} }
/* Fill not used startpos */ /* 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); error=(int) my_write(file,(byte*) buff,(uint) reclength,MYF_RW);
err: err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment