8440
We store the first 0 - 6 uneven bits among the null bits
8441
at the start of the record. The rest bytes are stored in
8446
CREATE TABLE t1 (a int, b bit(17), c bit(21) not null, d bit(8));
8447
We would store data as follows in the record:
8450
1 7 - reserve for delete
8451
6 - null bit for 'a'
8452
5 - null bit for 'b'
8453
4 - first (high) bit of 'b'
8454
3 - first (high) bit of 'c'
8455
2 - second bit of 'c'
8456
1 - third bit of 'c'
8457
0 - forth bit of 'c'
8458
2 7 - firth bit of 'c'
8459
6 - null bit for 'd'
8460
3 - 6 four bytes for 'a'
8461
7 - 8 two bytes for 'b'
8462
9 - 10 two bytes for 'c'
8466
Field_bit::Field_bit(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
8467
uchar null_bit_arg, uchar *bit_ptr_arg, uchar bit_ofs_arg,
8468
enum utype unireg_check_arg, const char *field_name_arg)
8469
: Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
8470
unireg_check_arg, field_name_arg),
8471
bit_ptr(bit_ptr_arg), bit_ofs(bit_ofs_arg), bit_len(len_arg & 7),
8472
bytes_in_rec(len_arg / 8)
8474
flags|= UNSIGNED_FLAG;
8476
Ensure that Field::eq() can distinguish between two different bit fields.
8477
(two bit fields that are not null, may have same ptr and null_ptr)
8480
null_bit= bit_ofs_arg;
8484
void Field_bit::hash(ulong *nr, ulong *nr2)
8488
*nr^= (*nr << 1) | 1;
8492
CHARSET_INFO *cs= &my_charset_bin;
8493
longlong value= Field_bit::val_int();
8495
mi_int8store(tmp,value);
8496
cs->coll->hash_sort(cs, tmp, 8, nr, nr2);
8502
Field_bit::do_last_null_byte() const
8505
Code elsewhere is assuming that bytes are 8 bits, so I'm using
8506
that value instead of the correct one: CHAR_BIT.
8508
REFACTOR SUGGESTION (Matz): Change to use the correct number of
8509
bits. On systems with CHAR_BIT > 8 (not very common), the storage
8510
will lose the extra bits.
8512
DBUG_PRINT("test", ("bit_ofs: %d, bit_len: %d bit_ptr: 0x%lx",
8513
bit_ofs, bit_len, (long) bit_ptr));
8517
else if (bit_ofs + bit_len > 8)
8518
result= bit_ptr + 1;
8523
return (size_t) (result - table->record[0]) + 1;
8524
return LAST_NULL_BYTE_UNDEF;
8528
Field *Field_bit::new_key_field(MEM_ROOT *root,
8529
struct st_table *new_table,
8530
uchar *new_ptr, uchar *new_null_ptr,
8534
if ((res= (Field_bit*) Field::new_key_field(root, new_table,
8535
new_ptr, new_null_ptr,
8538
/* Move bits normally stored in null_pointer to new_ptr */
8539
res->bit_ptr= new_ptr;
8542
res->ptr++; // Store rest of data here
8548
uint Field_bit::is_equal(Create_field *new_field)
8550
return (new_field->sql_type == real_type() &&
8551
new_field->length == max_display_length());
8555
int Field_bit::store(const char *from, uint length, CHARSET_INFO *cs)
8557
ASSERT_COLUMN_MARKED_FOR_WRITE;
8560
for (; length && !*from; from++, length--) {}; // skip left 0's
8561
delta= bytes_in_rec - length;
8564
(delta == -1 && (uchar) *from > ((1 << bit_len) - 1)) ||
8565
(!bit_len && delta < 0))
8567
set_rec_bits((1 << bit_len) - 1, bit_ptr, bit_ofs, bit_len);
8568
memset(ptr, 0xff, bytes_in_rec);
8569
if (table->in_use->really_abort_on_warning())
8570
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
8572
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
8575
/* delta is >= -1 here */
8579
clr_rec_bits(bit_ptr, bit_ofs, bit_len);
8581
memcpy(ptr + delta, from, length);
8583
else if (delta == 0)
8586
clr_rec_bits(bit_ptr, bit_ofs, bit_len);
8587
memcpy(ptr, from, length);
8593
set_rec_bits((uchar) *from, bit_ptr, bit_ofs, bit_len);
8596
memcpy(ptr, from, bytes_in_rec);
8602
int Field_bit::store(double nr)
8604
return Field_bit::store((longlong) nr, FALSE);
8608
int Field_bit::store(longlong nr, bool unsigned_val)
8612
mi_int8store(buf, nr);
8613
return store(buf, 8, NULL);
8617
int Field_bit::store_decimal(const my_decimal *val)
8620
longlong i= convert_decimal2longlong(val, 1, &err);
8621
return test(err | store(i, TRUE));
8625
double Field_bit::val_real(void)
8627
return (double) Field_bit::val_int();
8631
longlong Field_bit::val_int(void)
8633
ASSERT_COLUMN_MARKED_FOR_READ;
8637
bits= get_rec_bits(bit_ptr, bit_ofs, bit_len);
8638
bits<<= (bytes_in_rec * 8);
8641
switch (bytes_in_rec) {
8642
case 0: return bits;
8643
case 1: return bits | (uint64_t) ptr[0];
8644
case 2: return bits | mi_uint2korr(ptr);
8645
case 3: return bits | mi_uint3korr(ptr);
8646
case 4: return bits | mi_uint4korr(ptr);
8647
case 5: return bits | mi_uint5korr(ptr);
8648
case 6: return bits | mi_uint6korr(ptr);
8649
case 7: return bits | mi_uint7korr(ptr);
8650
default: return mi_uint8korr(ptr + bytes_in_rec - sizeof(longlong));
8655
String *Field_bit::val_str(String *val_buffer,
8656
String *val_ptr __attribute__((unused)))
8658
ASSERT_COLUMN_MARKED_FOR_READ;
8659
char buff[sizeof(longlong)];
8660
uint length= min(pack_length(), sizeof(longlong));
8661
uint64_t bits= val_int();
8662
mi_int8store(buff,bits);
8664
val_buffer->alloc(length);
8665
memcpy_fixed((char*) val_buffer->ptr(), buff+8-length, length);
8666
val_buffer->length(length);
8667
val_buffer->set_charset(&my_charset_bin);
8672
my_decimal *Field_bit::val_decimal(my_decimal *deciaml_value)
8674
ASSERT_COLUMN_MARKED_FOR_READ;
8675
int2my_decimal(E_DEC_FATAL_ERROR, val_int(), 1, deciaml_value);
8676
return deciaml_value;
8681
Compare two bit fields using pointers within the record.
8684
a Pointer to field->ptr in first record
8685
b Pointer to field->ptr in second record
8686
max_len Maximum length used in index
8688
This method is used from key_rec_cmp used by merge sorts used
8689
by partitioned index read and later other similar places.
8690
The a and b pointer must be pointers to the field in a record
8691
(not the table->record[0] necessarily)
8693
int Field_bit::cmp_max(const uchar *a, const uchar *b, uint max_len)
8695
my_ptrdiff_t a_diff= a - ptr;
8696
my_ptrdiff_t b_diff= b - ptr;
8700
uchar bits_a= get_rec_bits(bit_ptr+a_diff, bit_ofs, bit_len);
8701
uchar bits_b= get_rec_bits(bit_ptr+b_diff, bit_ofs, bit_len);
8702
if ((flag= (int) (bits_a - bits_b)))
8705
return memcmp(a, b, field_length);
8709
int Field_bit::key_cmp(const uchar *str, uint length)
8714
uchar bits= get_rec_bits(bit_ptr, bit_ofs, bit_len);
8715
if ((flag= (int) (bits - *str)))
8720
return memcmp(ptr, str, length);
8724
int Field_bit::cmp_offset(uint row_offset)
8729
uchar bits_a= get_rec_bits(bit_ptr, bit_ofs, bit_len);
8730
uchar bits_b= get_rec_bits(bit_ptr + row_offset, bit_ofs, bit_len);
8731
if ((flag= (int) (bits_a - bits_b)))
8734
return memcmp(ptr, ptr + row_offset, bytes_in_rec);
8738
uint Field_bit::get_key_image(uchar *buff, uint length, imagetype type_arg)
8742
uchar bits= get_rec_bits(bit_ptr, bit_ofs, bit_len);
8746
uint data_length = min(length, bytes_in_rec);
8747
memcpy(buff, ptr, data_length);
8748
return data_length + 1;
8753
Save the field metadata for bit fields.
8755
Saves the bit length in the first byte and bytes in record in the
8756
second byte of the field metadata array at index of *metadata_ptr and
8757
*(metadata_ptr + 1).
8759
@param metadata_ptr First byte of field metadata
8761
@returns number of bytes written to metadata_ptr
8763
int Field_bit::do_save_field_metadata(uchar *metadata_ptr)
8765
*metadata_ptr= bit_len;
8766
*(metadata_ptr + 1)= bytes_in_rec;
8772
Returns the number of bytes field uses in row-based replication
8775
This method is used in row-based replication to determine the number
8776
of bytes that the field consumes in the row record format. This is
8777
used to skip fields in the master that do not exist on the slave.
8779
@param field_metadata Encoded size in field metadata
8781
@returns The size of the field based on the field metadata.
8783
uint Field_bit::pack_length_from_metadata(uint field_metadata)
8785
uint const from_len= (field_metadata >> 8U) & 0x00ff;
8786
uint const from_bit_len= field_metadata & 0x00ff;
8787
uint const source_size= from_len + ((from_bit_len > 0) ? 1 : 0);
8788
return (source_size);
8793
Check to see if field size is compatible with destination.
8795
This method is used in row-based replication to verify that the slave's
8796
field size is less than or equal to the master's field size. The
8797
encoded field metadata (from the master or source) is decoded and compared
8798
to the size of this field (the slave or destination).
8800
@param field_metadata Encoded size in field metadata
8802
@retval 0 if this field's size is < the source field's size
8803
@retval 1 if this field's size is >= the source field's size
8805
int Field_bit::compatible_field_size(uint field_metadata)
8808
uint const source_size= pack_length_from_metadata(field_metadata);
8809
uint const destination_size= row_pack_length();
8810
uint const from_bit_len= field_metadata & 0x00ff;
8811
uint const from_len= (field_metadata >> 8U) & 0x00ff;
8812
if ((bit_len == 0) || (from_bit_len == 0))
8813
compatible= (source_size <= destination_size);
8814
else if (from_bit_len > bit_len)
8815
compatible= (from_len < bytes_in_rec);
8817
compatible= ((from_bit_len <= bit_len) && (from_len <= bytes_in_rec));
8818
return (compatible);
8823
void Field_bit::sql_type(String &res) const
8825
CHARSET_INFO *cs= res.charset();
8826
ulong length= cs->cset->snprintf(cs, (char*) res.ptr(), res.alloced_length(),
8827
"bit(%d)", (int) field_length);
8828
res.length((uint) length);
8833
Field_bit::pack(uchar *to, const uchar *from, uint max_length,
8834
bool low_byte_first __attribute__((unused)))
8836
DBUG_ASSERT(max_length > 0);
8841
We have the following:
8843
ptr Points into a field in record R1
8844
from Points to a field in a record R2
8845
bit_ptr Points to the byte (in the null bytes) that holds the
8847
from_bitp Points to the byte that holds the odd bits of R2
8849
We have the following:
8851
ptr - bit_ptr = from - from_bitp
8853
We want to isolate 'from_bitp', so this gives:
8855
ptr - bit_ptr - from = - from_bitp
8856
- ptr + bit_ptr + from = from_bitp
8857
bit_ptr + from - ptr = from_bitp
8859
uchar bits= get_rec_bits(bit_ptr + (from - ptr), bit_ofs, bit_len);
8862
length= min(bytes_in_rec, max_length - (bit_len > 0));
8863
memcpy(to, from, length);
8869
Unpack a bit field from row data.
8871
This method is used to unpack a bit field from a master whose size
8872
of the field is less than that of the slave.
8874
@param to Destination of the data
8875
@param from Source of the data
8876
@param param_data Bit length (upper) and length (lower) values
8878
@return New pointer into memory based on from + length of the data
8881
Field_bit::unpack(uchar *to, const uchar *from, uint param_data,
8882
bool low_byte_first __attribute__((unused)))
8884
uint const from_len= (param_data >> 8U) & 0x00ff;
8885
uint const from_bit_len= param_data & 0x00ff;
8887
If the parameter data is zero (i.e., undefined), or if the master
8888
and slave have the same sizes, then use the old unpack() method.
8890
if (param_data == 0 || ((from_bit_len == bit_len) && (from_len == bytes_in_rec)))
8895
set_rec_bits is a macro, don't put the post-increment in the
8896
argument since that might cause strange side-effects.
8898
For the choice of the second argument, see the explanation for
8901
set_rec_bits(*from, bit_ptr + (to - ptr), bit_ofs, bit_len);
8904
memcpy(to, from, bytes_in_rec);
8905
return from + bytes_in_rec;
8909
We are converting a smaller bit field to a larger one here.
8910
To do that, we first need to construct a raw value for the original
8911
bit value stored in the from buffer. Then that needs to be converted
8912
to the larger field then sent to store() for writing to the field.
8913
Lastly the odd bits need to be masked out if the bytes_in_rec > 0.
8914
Otherwise stray bits can cause spurious values.
8916
uint new_len= (field_length + 7) / 8;
8917
char *value= (char *)my_alloca(new_len);
8918
bzero(value, new_len);
8919
uint len= from_len + ((from_bit_len > 0) ? 1 : 0);
8920
memcpy(value + (new_len - len), from, len);
8922
Mask out the unused bits in the partial byte.
8923
TODO: Add code to the master to always mask these bits and remove
8926
if ((from_bit_len > 0) && (from_len > 0))
8927
value[new_len - len]= value[new_len - len] & ((1U << from_bit_len) - 1);
8928
bitmap_set_bit(table->write_set,field_index);
8929
store(value, new_len, system_charset_info);
8935
void Field_bit::set_default()
8939
my_ptrdiff_t const offset= table->s->default_values - table->record[0];
8940
uchar bits= get_rec_bits(bit_ptr + offset, bit_ofs, bit_len);
8941
set_rec_bits(bits, bit_ptr, bit_ofs, bit_len);
8943
Field::set_default();
8947
Bit field support for non-MyISAM tables.
8950
Field_bit_as_char::Field_bit_as_char(uchar *ptr_arg, uint32 len_arg,
8951
uchar *null_ptr_arg, uchar null_bit_arg,
8952
enum utype unireg_check_arg,
8953
const char *field_name_arg)
8954
:Field_bit(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, 0, 0,
8955
unireg_check_arg, field_name_arg)
8957
flags|= UNSIGNED_FLAG;
8959
bytes_in_rec= (len_arg + 7) / 8;
8963
int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs)
8965
ASSERT_COLUMN_MARKED_FOR_WRITE;
8967
uchar bits= (uchar) (field_length & 7);
8969
for (; length && !*from; from++, length--) {}; // skip left 0's
8970
delta= bytes_in_rec - length;
8973
(delta == 0 && bits && (uint) (uchar) *from >= (uint) (1 << bits)))
8975
memset(ptr, 0xff, bytes_in_rec);
8977
*ptr&= ((1 << bits) - 1); /* set first uchar */
8978
if (table->in_use->really_abort_on_warning())
8979
set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
8981
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
8985
memcpy(ptr + delta, from, length);
8990
void Field_bit_as_char::sql_type(String &res) const
8992
CHARSET_INFO *cs= res.charset();
8993
ulong length= cs->cset->snprintf(cs, (char*) res.ptr(), res.alloced_length(),
8994
"bit(%d)", (int) field_length);
8995
res.length((uint) length);
8999
8437
/*****************************************************************************
9000
8438
Handling of field and Create_field
9001
8439
*****************************************************************************/