22
#include <drizzled/server_includes.h>
23
23
#include <drizzled/field/varstring.h>
24
24
#include <drizzled/table.h>
25
25
#include <drizzled/session.h>
26
#include "plugin/myisam/myisam.h"
30
29
using namespace std;
35
31
/****************************************************************************
37
33
Data in field->ptr is stored as:
51
47
const uint32_t Field_varstring::MAX_SIZE= UINT16_MAX;
53
49
Field_varstring::Field_varstring(unsigned char *ptr_arg,
55
uint32_t length_bytes_arg,
50
uint32_t len_arg, uint32_t length_bytes_arg,
56
51
unsigned char *null_ptr_arg,
57
52
unsigned char null_bit_arg,
53
enum utype unireg_check_arg,
58
54
const char *field_name_arg,
60
56
const CHARSET_INFO * const cs)
57
:Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
58
unireg_check_arg, field_name_arg, cs),
66
59
length_bytes(length_bytes_arg)
68
61
share->varchar_fields++;
71
Field_varstring::Field_varstring(uint32_t len_arg,
64
Field_varstring::Field_varstring(uint32_t len_arg,bool maybe_null_arg,
73
65
const char *field_name_arg,
75
67
const CHARSET_INFO * const cs)
76
:Field_str((unsigned char*) 0,
78
maybe_null_arg ? (unsigned char*) "": 0,
68
:Field_longstr((unsigned char*) 0,len_arg,
69
maybe_null_arg ? (unsigned char*) "": 0, 0,
70
NONE, field_name_arg, cs),
82
71
length_bytes(len_arg < 256 ? 1 :2)
84
73
share->varchar_fields++;
78
Save the field metadata for varstring fields.
80
Saves the field length in the first byte. Note: may consume
81
2 bytes. Caller must ensure second byte is contiguous with
82
first byte (e.g. array index 0,1).
84
@param metadata_ptr First byte of field metadata
86
@returns number of bytes written to metadata_ptr
88
int Field_varstring::do_save_field_metadata(unsigned char *metadata_ptr)
90
char *ptr= (char *)metadata_ptr;
91
assert(field_length <= 65535);
92
int2store(ptr, field_length);
87
96
int Field_varstring::store(const char *from,uint32_t length, const CHARSET_INFO * const cs)
89
98
uint32_t copy_length;
135
142
char *end_not_used;
137
ASSERT_COLUMN_MARKED_FOR_READ;
139
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
143
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
141
144
return my_strntod(field_charset, (char*) ptr+length_bytes, length,
142
145
&end_not_used, ¬_used);
149
152
char *end_not_used;
152
ASSERT_COLUMN_MARKED_FOR_READ;
154
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
153
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
156
154
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
157
155
&end_not_used, ¬_used);
160
String *Field_varstring::val_str(String *,
158
String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
163
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
165
ASSERT_COLUMN_MARKED_FOR_READ;
161
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
167
162
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
173
167
my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value)
177
ASSERT_COLUMN_MARKED_FOR_READ;
179
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
169
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
181
170
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
182
171
charset(), decimal_value);
183
172
return decimal_value;
221
210
int Field_varstring::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
223
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
212
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
224
213
uint32_t local_char_length= max_key_length / field_charset->mbmaxlen;
226
215
local_char_length= my_charpos(field_charset, ptr + length_bytes,
313
307
unsigned char *Field_varstring::pack(unsigned char *to, const unsigned char *from,
314
308
uint32_t max_length,
309
bool low_byte_first __attribute__((unused)))
317
uint32_t length= length_bytes == 1 ? (uint32_t) *from : uint2korr(from);
311
uint32_t length= length_bytes == 1 ? (uint) *from : uint2korr(from);
318
312
set_if_smaller(max_length, field_length);
319
313
if (length > max_length)
320
314
length=max_length;
329
Field_varstring::pack_key(unsigned char *to, const unsigned char *key, uint32_t max_length,
330
bool low_byte_first __attribute__((unused)))
332
uint32_t length= length_bytes == 1 ? (uint) *key : uint2korr(key);
333
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
334
max_length/field_charset->mbmaxlen : max_length);
336
if (length > local_char_length)
338
local_char_length= my_charpos(field_charset, key, key+length,
340
set_if_smaller(length, local_char_length);
342
*to++= (char) (length & 255);
343
if (max_length > 255)
344
*to++= (char) (length >> 8);
346
memcpy(to, key, length);
352
Unpack a key into a record buffer.
354
A VARCHAR key has a maximum size of 64K-1.
355
In its packed form, the length field is one or two bytes long,
356
depending on 'max_length'.
358
@param to Pointer into the record buffer.
359
@param key Pointer to the packed key.
360
@param max_length Key length limit from key description.
363
Pointer to end of 'key' (To the next key part if multi-segment key)
366
const unsigned char *
367
Field_varstring::unpack_key(unsigned char *to __attribute__((unused)),
368
const unsigned char *key, uint32_t max_length,
369
bool low_byte_first __attribute__((unused)))
371
/* get length of the blob key */
372
uint32_t length= *key++;
373
if (max_length > 255)
374
length+= (*key++) << 8;
376
/* put the length into the record buffer */
377
if (length_bytes == 1)
378
*ptr= (unsigned char) length;
380
int2store(ptr, length);
381
memcpy(ptr + length_bytes, key, length);
386
Create a packed key that will be used for storage in the index tree.
388
@param to Store packed key segment here
389
@param from Key segment (as given to index_read())
390
@param max_length Max length of key
397
Field_varstring::pack_key_from_key_image(unsigned char *to, const unsigned char *from, uint32_t max_length,
398
bool low_byte_first __attribute__((unused)))
400
/* Key length is always stored as 2 bytes */
401
uint32_t length= uint2korr(from);
402
if (length > max_length)
404
*to++= (char) (length & 255);
405
if (max_length > 255)
406
*to++= (char) (length >> 8);
408
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
335
414
Unpack a varstring field from row data.
455
int Field_varstring::pack_cmp(const unsigned char *a, const unsigned char *b,
456
uint32_t key_length_arg,
457
bool insert_or_update)
459
uint32_t a_length, b_length;
460
if (key_length_arg > 255)
462
a_length=uint2korr(a); a+= 2;
463
b_length=uint2korr(b); b+= 2;
467
a_length= (uint) *a++;
468
b_length= (uint) *b++;
470
return field_charset->coll->strnncollsp(field_charset,
477
int Field_varstring::pack_cmp(const unsigned char *b, uint32_t key_length_arg,
478
bool insert_or_update)
480
unsigned char *a= ptr+ length_bytes;
481
uint32_t a_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
483
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
484
key_length_arg / field_charset->mbmaxlen :
487
if (key_length_arg > 255)
489
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
492
b_length= (uint) *b++;
494
if (a_length > local_char_length)
496
local_char_length= my_charpos(field_charset, a, a+a_length,
498
set_if_smaller(a_length, local_char_length);
501
return field_charset->coll->strnncollsp(field_charset,
508
uint32_t Field_varstring::packed_col_length(const unsigned char *data_ptr, uint32_t length)
511
return uint2korr(data_ptr)+2;
512
return (uint) *data_ptr + 1;
376
516
uint32_t Field_varstring::max_packed_col_length(uint32_t max_length)
378
518
return (max_length > 255 ? 2 : 1)+max_length;
381
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff, uint32_t length)
521
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff,
522
uint32_t length, imagetype)
383
524
/* Key is always stored with 2 bytes */
384
525
const uint32_t key_len= 2;
385
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
526
uint32_t f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
386
527
uint32_t local_char_length= length / field_charset->mbmaxlen;
387
528
unsigned char *pos= ptr+length_bytes;
388
529
local_char_length= my_charpos(field_charset, pos, pos + f_length,
407
uint32_t Field_varstring::get_key_image(unsigned char *buff, uint32_t length)
548
uint32_t Field_varstring::get_key_image(unsigned char *buff,
550
imagetype type __attribute__((unused)))
409
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
552
uint32_t f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
410
553
uint32_t local_char_length= length / field_charset->mbmaxlen;
411
554
unsigned char *pos= ptr+length_bytes;
412
555
local_char_length= my_charpos(field_charset, pos, pos + f_length,
426
569
return HA_KEY_BLOB_LENGTH+f_length;
429
void Field_varstring::set_key_image(const unsigned char *buff, uint32_t length)
573
void Field_varstring::set_key_image(const unsigned char *buff,uint32_t length)
431
575
length= uint2korr(buff); // Real length is here
432
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
576
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
435
int Field_varstring::cmp_binary(const unsigned char *a_ptr,
436
const unsigned char *b_ptr,
581
int Field_varstring::cmp_binary(const unsigned char *a_ptr, const unsigned char *b_ptr,
437
582
uint32_t max_length)
439
584
uint32_t a_length,b_length;
441
586
if (length_bytes == 1)
443
a_length= (uint32_t) *a_ptr;
444
b_length= (uint32_t) *b_ptr;
588
a_length= (uint) *a_ptr;
589
b_length= (uint) *b_ptr;
459
Field *Field_varstring::new_field(memory::Root *root, Table *new_table, bool keep_type)
604
Field *Field_varstring::new_field(MEM_ROOT *root, Table *new_table, bool keep_type)
461
606
Field_varstring *res= (Field_varstring*) Field::new_field(root, new_table,
487
} /* namespace drizzled */
633
uint32_t Field_varstring::is_equal(Create_field *new_field)
635
if (new_field->sql_type == real_type() &&
636
new_field->charset == field_charset)
638
if (new_field->length == max_display_length())
640
if (new_field->length > max_display_length() &&
641
((new_field->length <= 255 && max_display_length() <= 255) ||
642
(new_field->length > 255 && max_display_length() > 255)))
643
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
649
void Field_varstring::hash(uint32_t *nr, uint32_t *nr2)
653
*nr^= (*nr << 1) | 1;
657
uint32_t len= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
658
const CHARSET_INFO * const cs= charset();
659
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);