18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
#ifdef USE_PRAGMA_IMPLEMENTATION
22
#pragma implementation // gcc: Class implementation
25
#include <drizzled/server_includes.h>
23
26
#include <drizzled/field/blob.h>
24
#include <drizzled/table.h>
25
#include <drizzled/session.h>
26
#include "plugin/myisam/myisam.h"
36
static uint32_t blob_pack_length_to_max_length(uint32_t arg)
38
return max(UINT32_MAX,
39
(uint32_t)((INT64_C(1) << min(arg, 4U) * 8) - INT64_C(1)));
29
blob_pack_length_to_max_length(uint arg)
31
return (1LL << min(arg, 4U) * 8) - 1LL;
43
35
/****************************************************************************
45
37
** A blob is saved as a length and a pointer. The length is stored in the
46
** packlength slot and is sizeof(uint32_t) (4 bytes)
38
** packlength slot and may be from 1-4.
47
39
****************************************************************************/
49
Field_blob::Field_blob(unsigned char *ptr_arg,
50
unsigned char *null_ptr_arg,
51
unsigned char null_bit_arg,
52
const char *field_name_arg,
54
const CHARSET_INFO * const cs)
56
blob_pack_length_to_max_length(sizeof(uint32_t)),
41
Field_blob::Field_blob(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
42
enum utype unireg_check_arg, const char *field_name_arg,
43
TABLE_SHARE *share, uint blob_pack_length,
44
const CHARSET_INFO * const cs)
45
:Field_longstr(ptr_arg, blob_pack_length_to_max_length(blob_pack_length),
46
null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
48
packlength(blob_pack_length)
63
51
share->blob_fields++;
64
/* TODO: why do not fill table->getShare()->blob_field array here? */
52
/* TODO: why do not fill table->s->blob_field array here? */
67
void Field_blob::store_length(unsigned char *i_ptr,
56
void Field_blob::store_length(uchar *i_ptr,
71
#ifndef WORDS_BIGENDIAN
75
#ifdef WORDS_BIGENDIAN
78
int4store(i_ptr,i_number);
82
longstore(i_ptr,i_number);
86
void Field_blob::store_length(unsigned char *i_ptr, uint32_t i_number)
88
store_length(i_ptr, i_number, getTable()->getShare()->db_low_byte_first);
92
uint32_t Field_blob::get_length(const unsigned char *pos,
95
#ifndef WORDS_BIGENDIAN
99
#ifdef WORDS_BIGENDIAN
105
return (uint32_t) tmp;
109
uint32_t Field_blob::get_packed_size(const unsigned char *ptr_arg,
112
return sizeof(uint32_t) + get_length(ptr_arg, low_byte_first);
116
uint32_t Field_blob::get_length(uint32_t row_offset)
118
return get_length(ptr+row_offset,
119
getTable()->getShare()->db_low_byte_first);
123
uint32_t Field_blob::get_length(const unsigned char *ptr_arg)
125
return get_length(ptr_arg, getTable()->getShare()->db_low_byte_first);
59
bool low_byte_first __attribute__((unused)))
61
switch (i_packlength) {
63
i_ptr[0]= (uchar) i_number;
66
#ifdef WORDS_BIGENDIAN
69
int2store(i_ptr,(unsigned short) i_number);
73
shortstore(i_ptr,(unsigned short) i_number);
76
int3store(i_ptr,i_number);
79
#ifdef WORDS_BIGENDIAN
82
int4store(i_ptr,i_number);
86
longstore(i_ptr,i_number);
91
uint32_t Field_blob::get_length(const uchar *pos,
93
bool low_byte_first __attribute__((unused)))
95
switch (packlength_arg) {
97
return (uint32_t) pos[0];
101
#ifdef WORDS_BIGENDIAN
107
return (uint32_t) tmp;
110
return (uint32_t) uint3korr(pos);
114
#ifdef WORDS_BIGENDIAN
120
return (uint32_t) tmp;
123
return 0; // Impossible
130
128
Put a blob length field into a record buffer.
132
Blob length is always stored in sizeof(uint32_t) (4 bytes)
130
Depending on the maximum length of a blob, its length field is
131
put into 1 to 4 bytes. This is a property of the blob object,
132
described by 'packlength'.
134
134
@param pos Pointer into the record buffer.
135
135
@param length The length value to put.
138
void Field_blob::put_length(unsigned char *pos, uint32_t length)
138
void Field_blob::put_length(uchar *pos, uint32_t length)
140
switch (packlength) {
145
int2store(pos, length);
148
int3store(pos, length);
140
151
int4store(pos, length);
144
int Field_blob::store(const char *from,uint32_t length, const CHARSET_INFO * const cs)
157
int Field_blob::store(const char *from,uint length, const CHARSET_INFO * const cs)
146
uint32_t copy_length, new_length;
159
uint copy_length, new_length;
147
160
const char *well_formed_error_pos;
148
161
const char *cannot_convert_error_pos;
149
162
const char *from_end_pos, *tmp;
150
163
char buff[STRING_BUFFER_USUAL_SIZE];
151
164
String tmpstr(buff,sizeof(buff), &my_charset_bin);
153
ASSERT_COLUMN_MARKED_FOR_WRITE;
157
168
memset(ptr, 0, Field_blob::pack_length());
203
225
/* Fatal OOM error */
204
226
memset(ptr, 0, Field_blob::pack_length());
209
231
int Field_blob::store(double nr)
211
233
const CHARSET_INFO * const cs=charset();
212
ASSERT_COLUMN_MARKED_FOR_WRITE;
213
234
value.set_real(nr, NOT_FIXED_DEC, cs);
214
return Field_blob::store(value.ptr(),(uint32_t) value.length(), cs);
235
return Field_blob::store(value.ptr(),(uint) value.length(), cs);
218
239
int Field_blob::store(int64_t nr, bool unsigned_val)
220
241
const CHARSET_INFO * const cs=charset();
221
ASSERT_COLUMN_MARKED_FOR_WRITE;
222
242
value.set_int(nr, unsigned_val, cs);
223
return Field_blob::store(value.ptr(), (uint32_t) value.length(), cs);
243
return Field_blob::store(value.ptr(), (uint) value.length(), cs);
250
ASSERT_COLUMN_MARKED_FOR_READ;
252
memcpy(&blob,ptr+sizeof(uint32_t),sizeof(char*));
267
memcpy(&blob,ptr+packlength,sizeof(char*));
255
270
uint32_t length=get_length(ptr);
256
271
return my_strntoll(charset(),blob,length,10,NULL,¬_used);
259
String *Field_blob::val_str(String *,
274
String *Field_blob::val_str(String *val_buffer __attribute__((unused)),
264
ASSERT_COLUMN_MARKED_FOR_READ;
266
memcpy(&blob,ptr+sizeof(uint32_t),sizeof(char*));
278
memcpy(&blob,ptr+packlength,sizeof(char*));
268
280
val_ptr->set("",0,charset()); // A bit safer than ->length(0)
297
int Field_blob::cmp(const unsigned char *a,uint32_t a_length, const unsigned char *b,
306
int Field_blob::cmp(const uchar *a,uint32_t a_length, const uchar *b,
298
307
uint32_t b_length)
300
return field_charset->coll->strnncollsp(field_charset,
309
return field_charset->coll->strnncollsp(field_charset,
301
310
a, a_length, b, b_length,
306
int Field_blob::cmp_max(const unsigned char *a_ptr, const unsigned char *b_ptr,
315
int Field_blob::cmp_max(const uchar *a_ptr, const uchar *b_ptr,
309
unsigned char *blob1,*blob2;
310
memcpy(&blob1,a_ptr+sizeof(uint32_t),sizeof(char*));
311
memcpy(&blob2,b_ptr+sizeof(uint32_t),sizeof(char*));
312
uint32_t a_len= get_length(a_ptr), b_len= get_length(b_ptr);
319
memcpy(&blob1,a_ptr+packlength,sizeof(char*));
320
memcpy(&blob2,b_ptr+packlength,sizeof(char*));
321
uint a_len= get_length(a_ptr), b_len= get_length(b_ptr);
313
322
set_if_smaller(a_len, max_length);
314
323
set_if_smaller(b_len, max_length);
315
324
return Field_blob::cmp(blob1,a_len,blob2,b_len);
319
int Field_blob::cmp_binary(const unsigned char *a_ptr, const unsigned char *b_ptr,
328
int Field_blob::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
324
333
uint32_t a_length,b_length;
325
memcpy(&a,a_ptr+sizeof(uint32_t),sizeof(char*));
326
memcpy(&b,b_ptr+sizeof(uint32_t),sizeof(char*));
328
a_length= get_length(a_ptr);
334
memcpy(&a,a_ptr+packlength,sizeof(char*));
335
memcpy(&b,b_ptr+packlength,sizeof(char*));
336
a_length=get_length(a_ptr);
330
337
if (a_length > max_length)
331
a_length= max_length;
333
b_length= get_length(b_ptr);
339
b_length=get_length(b_ptr);
335
340
if (b_length > max_length)
336
b_length= max_length;
338
diff= memcmp(a,b,min(a_length,b_length));
340
return diff ? diff : (unsigned int) (a_length - b_length);
342
diff=memcmp(a,b,min(a_length,b_length));
343
return diff ? diff : (int) (a_length - b_length);
343
347
/* The following is used only when comparing a key */
344
uint32_t Field_blob::get_key_image(unsigned char *buff, uint32_t length)
349
uint Field_blob::get_key_image(uchar *buff,
351
imagetype type_arg __attribute__((unused)))
346
353
uint32_t blob_length= get_length(ptr);
350
uint32_t local_char_length= length / field_charset->mbmaxlen;
357
uint local_char_length= length / field_charset->mbmaxlen;
351
358
local_char_length= my_charpos(field_charset, blob, blob + blob_length,
352
359
local_char_length);
353
360
set_if_smaller(blob_length, local_char_length);
370
uint32_t Field_blob::get_key_image(basic_string<unsigned char> &buff, uint32_t length)
372
uint32_t blob_length= get_length(ptr);
376
uint32_t local_char_length= length / field_charset->mbmaxlen;
377
local_char_length= my_charpos(field_charset, blob, blob + blob_length,
379
set_if_smaller(blob_length, local_char_length);
381
unsigned char len_buff[HA_KEY_BLOB_LENGTH];
382
int2store(len_buff,length);
383
buff.append(len_buff);
384
buff.append(blob, blob_length);
386
if (length > blob_length)
389
Must clear this as we do a memcmp in optimizer/range.cc to detect
393
buff.append(length-blob_length, '0');
395
return HA_KEY_BLOB_LENGTH+length;
398
void Field_blob::set_key_image(const unsigned char *buff,uint32_t length)
377
void Field_blob::set_key_image(const uchar *buff,uint length)
400
379
length= uint2korr(buff);
401
(void) Field_blob::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
380
(void) Field_blob::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
404
int Field_blob::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
385
int Field_blob::key_cmp(const uchar *key_ptr, uint max_key_length)
406
unsigned char *blob1;
407
uint32_t blob_length=get_length(ptr);
408
memcpy(&blob1,ptr+sizeof(uint32_t),sizeof(char*));
388
uint blob_length=get_length(ptr);
389
memcpy(&blob1,ptr+packlength,sizeof(char*));
409
390
const CHARSET_INFO * const cs= charset();
410
uint32_t local_char_length= max_key_length / cs->mbmaxlen;
391
uint local_char_length= max_key_length / cs->mbmaxlen;
411
392
local_char_length= my_charpos(cs, blob1, blob1+blob_length,
412
393
local_char_length);
413
394
set_if_smaller(blob_length, local_char_length);
416
397
uint2korr(key_ptr));
419
int Field_blob::key_cmp(const unsigned char *a,const unsigned char *b)
400
int Field_blob::key_cmp(const uchar *a,const uchar *b)
421
402
return Field_blob::cmp(a+HA_KEY_BLOB_LENGTH, uint2korr(a),
422
403
b+HA_KEY_BLOB_LENGTH, uint2korr(b));
408
Save the field metadata for blob fields.
410
Saves the pack length in the first byte of the field metadata array
411
at index of *metadata_ptr.
413
@param metadata_ptr First byte of field metadata
415
@returns number of bytes written to metadata_ptr
417
int Field_blob::do_save_field_metadata(uchar *metadata_ptr)
419
*metadata_ptr= pack_length_no_ptr();
425
424
uint32_t Field_blob::sort_length() const
427
return (uint32_t) (current_session->variables.max_sort_length +
428
(field_charset == &my_charset_bin ? 0 : sizeof(uint32_t)));
426
return (uint32_t) (current_thd->variables.max_sort_length +
427
(field_charset == &my_charset_bin ? 0 : packlength));
431
void Field_blob::sort_string(unsigned char *to,uint32_t length)
431
void Field_blob::sort_string(uchar *to,uint length)
434
uint32_t blob_length=get_length();
434
uint blob_length=get_length();
436
436
if (!blob_length)
437
437
memset(to, 0, length);
440
440
if (field_charset == &my_charset_bin)
445
445
Store length of blob last in blob to shorter blobs before longer blobs
447
length-= sizeof(uint32_t); // size of stored blob length
450
mi_int4store(pos, blob_length);
450
switch (packlength) {
452
*pos= (char) blob_length;
455
mi_int2store(pos, blob_length);
458
mi_int3store(pos, blob_length);
461
mi_int4store(pos, blob_length);
452
memcpy(&blob,ptr+sizeof(uint32_t),sizeof(char*));
465
memcpy(&blob,ptr+packlength,sizeof(char*));
454
467
blob_length=my_strnxfrm(field_charset,
455
468
to, length, blob, blob_length);
456
469
assert(blob_length == length);
460
uint32_t Field_blob::pack_length() const
462
return (uint32_t) (sizeof(uint32_t) + portable_sizeof_char_ptr);
465
474
void Field_blob::sql_type(String &res) const
470
479
res.set_ascii(STRING_WITH_LEN("text"));
473
unsigned char *Field_blob::pack(unsigned char *to, const unsigned char *from,
474
uint32_t max_length, bool low_byte_first)
482
uchar *Field_blob::pack(uchar *to, const uchar *from,
483
uint max_length, bool low_byte_first)
476
unsigned char *save= ptr;
477
ptr= (unsigned char*) from;
478
uint32_t length= get_length(); // Length of from string
487
uint32_t length=get_length(); // Length of from string
481
490
Store max length, which will occupy packlength bytes. If the max
482
491
length given is smaller than the actual length of the blob, we
483
492
just store the initial bytes of the blob.
485
store_length(to, min(length, max_length), low_byte_first);
494
store_length(to, packlength, min(length, max_length), low_byte_first);
488
497
Store the actual blob data, which will occupy 'length' bytes.
492
get_ptr((unsigned char**) &from);
493
memcpy(to+sizeof(uint32_t), from,length);
501
get_ptr((uchar**) &from);
502
memcpy(to+packlength, from,length);
496
ptr= save; // Restore org row pointer
497
return(to+sizeof(uint32_t)+length);
504
ptr=save; // Restore org row pointer
505
return(to+packlength+length);
501
510
Unpack a blob field from row data.
503
This method is used to unpack a blob field from a master whose size of
512
This method is used to unpack a blob field from a master whose size of
504
513
the field is less than that of the slave. Note: This method is included
505
514
to satisfy inheritance rules, but is not needed for blob fields. It
506
515
simply is used as a pass-through to the original unpack() method for
515
524
@return New pointer into memory based on from + length of the data
517
const unsigned char *Field_blob::unpack(unsigned char *,
518
const unsigned char *from,
526
const uchar *Field_blob::unpack(uchar *to __attribute__((unused)),
522
uint32_t const length= get_length(from, low_byte_first);
523
getTable()->setWriteSet(position());
524
store(reinterpret_cast<const char*>(from) + sizeof(uint32_t),
531
uint const master_packlength=
532
param_data > 0 ? param_data & 0xFF : packlength;
533
uint32_t const length= get_length(from, master_packlength, low_byte_first);
534
bitmap_set_bit(table->write_set, field_index);
535
store(reinterpret_cast<const char*>(from) + master_packlength,
525
536
length, field_charset);
526
return(from + sizeof(uint32_t) + length);
537
return(from + master_packlength + length);
540
/* Keys for blobs are like keys on varchars */
542
int Field_blob::pack_cmp(const uchar *a, const uchar *b, uint key_length_arg,
543
bool insert_or_update)
545
uint a_length, b_length;
546
if (key_length_arg > 255)
548
a_length=uint2korr(a); a+=2;
549
b_length=uint2korr(b); b+=2;
553
a_length= (uint) *a++;
554
b_length= (uint) *b++;
556
return field_charset->coll->strnncollsp(field_charset,
563
int Field_blob::pack_cmp(const uchar *b, uint key_length_arg,
564
bool insert_or_update)
567
uint a_length, b_length;
568
memcpy(&a,ptr+packlength,sizeof(char*));
570
return key_length_arg > 0 ? -1 : 0;
572
a_length= get_length(ptr);
573
if (key_length_arg > 255)
575
b_length= uint2korr(b); b+=2;
578
b_length= (uint) *b++;
579
return field_charset->coll->strnncollsp(field_charset,
529
585
/** Create a packed key that will be used for storage from a MySQL row. */
532
Field_blob::pack_key(unsigned char *to, const unsigned char *from, uint32_t max_length,
588
Field_blob::pack_key(uchar *to, const uchar *from, uint max_length,
589
bool low_byte_first __attribute__((unused)))
535
unsigned char *save= ptr;
536
ptr= (unsigned char*) from;
537
593
uint32_t length=get_length(); // Length of from string
538
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
594
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
539
595
max_length/field_charset->mbmaxlen : max_length);
541
get_ptr((unsigned char**) &from);
597
get_ptr((uchar**) &from);
542
598
if (length > local_char_length)
543
599
local_char_length= my_charpos(field_charset, from, from+length,
544
600
local_char_length);
545
601
set_if_smaller(length, local_char_length);
546
*to++= (unsigned char) length;
602
*to++= (uchar) length;
547
603
if (max_length > 255) // 2 byte length
548
*to++= (unsigned char) (length >> 8);
604
*to++= (uchar) (length >> 8);
549
605
memcpy(to, from, length);
550
606
ptr=save; // Restore org row pointer
551
607
return to+length;
612
Unpack a blob key into a record buffer.
614
A blob key has a maximum size of 64K-1.
615
In its packed form, the length field is one or two bytes long,
616
depending on 'max_length'.
617
Depending on the maximum length of a blob, its length field is
618
put into 1 to 4 bytes. This is a property of the blob object,
619
described by 'packlength'.
620
Blobs are internally stored apart from the record buffer, which
621
contains a pointer to the blob buffer.
624
@param to Pointer into the record buffer.
625
@param from Pointer to the packed key.
626
@param max_length Key length limit from key description.
629
Pointer into 'from' past the last byte copied from packed key.
633
Field_blob::unpack_key(uchar *to, const uchar *from, uint max_length,
634
bool low_byte_first __attribute__((unused)))
636
/* get length of the blob key */
637
uint32_t length= *from++;
638
if (max_length > 255)
639
length+= *from++ << 8;
641
/* put the length into the record buffer */
642
put_length(to, length);
644
/* put the address of the blob buffer or NULL */
646
memcpy(to + packlength, &from, sizeof(from));
648
memset(to + packlength, 0, sizeof(from));
650
/* point to first byte of next field in 'from' */
651
return from + length;
655
/** Create a packed key that will be used for storage from a MySQL key. */
658
Field_blob::pack_key_from_key_image(uchar *to, const uchar *from, uint max_length,
659
bool low_byte_first __attribute__((unused)))
661
uint length=uint2korr(from);
662
if (length > max_length)
664
*to++= (char) (length & 255);
665
if (max_length > 255)
666
*to++= (char) (length >> 8);
668
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
673
uint Field_blob::packed_col_length(const uchar *data_ptr, uint length)
676
return uint2korr(data_ptr)+2;
677
return (uint) *data_ptr + 1;
681
uint Field_blob::max_packed_col_length(uint max_length)
683
return (max_length > 255 ? 2 : 1)+max_length;
687
uint Field_blob::is_equal(Create_field *new_field)
689
if (compare_str_field_flags(new_field, flags))
692
return ((new_field->sql_type == get_blob_type_from_length(max_data_length()))
693
&& new_field->charset == field_charset &&
694
((Field_blob *)new_field->field)->max_data_length() ==
556
700
maximum possible display length for blob.