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
assert(field_length <= 65535);
91
int2store(metadata_ptr, field_length);
87
95
int Field_varstring::store(const char *from,uint32_t length, const CHARSET_INFO * const cs)
89
97
uint32_t copy_length;
149
151
char *end_not_used;
152
ASSERT_COLUMN_MARKED_FOR_READ;
154
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
152
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
156
153
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
157
154
&end_not_used, ¬_used);
163
160
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
165
ASSERT_COLUMN_MARKED_FOR_READ;
167
161
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
173
166
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);
168
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
181
169
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
182
170
charset(), decimal_value);
183
171
return decimal_value;
328
Field_varstring::pack_key(unsigned char *to, const unsigned char *key, uint32_t max_length,
331
uint32_t length= length_bytes == 1 ? (uint32_t) *key : uint2korr(key);
332
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
333
max_length/field_charset->mbmaxlen : max_length);
335
if (length > local_char_length)
337
local_char_length= my_charpos(field_charset, key, key+length,
339
set_if_smaller(length, local_char_length);
341
*to++= (char) (length & 255);
342
if (max_length > 255)
343
*to++= (char) (length >> 8);
345
memcpy(to, key, length);
351
Unpack a key into a record buffer.
353
A VARCHAR key has a maximum size of 64K-1.
354
In its packed form, the length field is one or two bytes long,
355
depending on 'max_length'.
357
@param to Pointer into the record buffer.
358
@param key Pointer to the packed key.
359
@param max_length Key length limit from key description.
362
Pointer to end of 'key' (To the next key part if multi-segment key)
365
const unsigned char *
366
Field_varstring::unpack_key(unsigned char *,
367
const unsigned char *key, uint32_t max_length,
370
/* get length of the blob key */
371
uint32_t length= *key++;
372
if (max_length > 255)
373
length+= (*key++) << 8;
375
/* put the length into the record buffer */
376
if (length_bytes == 1)
377
*ptr= (unsigned char) length;
379
int2store(ptr, length);
380
memcpy(ptr + length_bytes, key, length);
385
Create a packed key that will be used for storage in the index tree.
387
@param to Store packed key segment here
388
@param from Key segment (as given to index_read())
389
@param max_length Max length of key
396
Field_varstring::pack_key_from_key_image(unsigned char *to, const unsigned char *from, uint32_t max_length,
399
/* Key length is always stored as 2 bytes */
400
uint32_t length= uint2korr(from);
401
if (length > max_length)
403
*to++= (char) (length & 255);
404
if (max_length > 255)
405
*to++= (char) (length >> 8);
407
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
335
413
Unpack a varstring field from row data.
454
int Field_varstring::pack_cmp(const unsigned char *a, const unsigned char *b,
455
uint32_t key_length_arg,
456
bool insert_or_update)
458
uint32_t a_length, b_length;
459
if (key_length_arg > 255)
461
a_length=uint2korr(a); a+= 2;
462
b_length=uint2korr(b); b+= 2;
466
a_length= (uint32_t) *a++;
467
b_length= (uint32_t) *b++;
469
return field_charset->coll->strnncollsp(field_charset,
476
int Field_varstring::pack_cmp(const unsigned char *b, uint32_t key_length_arg,
477
bool insert_or_update)
479
unsigned char *a= ptr+ length_bytes;
480
uint32_t a_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
482
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
483
key_length_arg / field_charset->mbmaxlen :
486
if (key_length_arg > 255)
488
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
491
b_length= (uint32_t) *b++;
493
if (a_length > local_char_length)
495
local_char_length= my_charpos(field_charset, a, a+a_length,
497
set_if_smaller(a_length, local_char_length);
500
return field_charset->coll->strnncollsp(field_charset,
507
uint32_t Field_varstring::packed_col_length(const unsigned char *data_ptr, uint32_t length)
510
return uint2korr(data_ptr)+2;
511
return (uint32_t) *data_ptr + 1;
376
515
uint32_t Field_varstring::max_packed_col_length(uint32_t max_length)
378
517
return (max_length > 255 ? 2 : 1)+max_length;
381
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff, uint32_t length)
520
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff,
521
uint32_t length, imagetype)
383
523
/* Key is always stored with 2 bytes */
384
524
const uint32_t key_len= 2;
426
568
return HA_KEY_BLOB_LENGTH+f_length;
429
void Field_varstring::set_key_image(const unsigned char *buff, uint32_t length)
572
void Field_varstring::set_key_image(const unsigned char *buff,uint32_t length)
431
574
length= uint2korr(buff); // Real length is here
432
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
575
(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,
580
int Field_varstring::cmp_binary(const unsigned char *a_ptr, const unsigned char *b_ptr,
437
581
uint32_t max_length)
439
583
uint32_t a_length,b_length;
459
Field *Field_varstring::new_field(memory::Root *root, Table *new_table, bool keep_type)
603
Field *Field_varstring::new_field(MEM_ROOT *root, Table *new_table, bool keep_type)
461
605
Field_varstring *res= (Field_varstring*) Field::new_field(root, new_table,
487
} /* namespace drizzled */
632
uint32_t Field_varstring::is_equal(Create_field *new_field_ptr)
634
if (new_field_ptr->sql_type == real_type() &&
635
new_field_ptr->charset == field_charset)
637
if (new_field_ptr->length == max_display_length())
639
if (new_field_ptr->length > max_display_length() &&
640
((new_field_ptr->length <= 255 && max_display_length() <= 255) ||
641
(new_field_ptr->length > 255 && max_display_length() > 255)))
642
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
648
void Field_varstring::hash(uint32_t *nr, uint32_t *nr2)
652
*nr^= (*nr << 1) | 1;
656
uint32_t len= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
657
const CHARSET_INFO * const cs= charset();
658
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);