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/varstring.h>
24
#include <drizzled/table.h>
25
#include <drizzled/session.h>
26
#include "plugin/myisam/myisam.h"
35
28
/****************************************************************************
49
42
****************************************************************************/
51
const uint32_t Field_varstring::MAX_SIZE= UINT16_MAX;
53
Field_varstring::Field_varstring(unsigned char *ptr_arg,
55
uint32_t length_bytes_arg,
56
unsigned char *null_ptr_arg,
57
unsigned char null_bit_arg,
58
const char *field_name_arg,
59
const CHARSET_INFO * const cs) :
65
length_bytes(length_bytes_arg)
69
Field_varstring::Field_varstring(uint32_t len_arg,
71
const char *field_name_arg,
72
const CHARSET_INFO * const cs) :
73
Field_str((unsigned char*) 0,
75
maybe_null_arg ? (unsigned char*) "": 0,
79
length_bytes(len_arg < 256 ? 1 :2)
83
int Field_varstring::store(const char *from,uint32_t length, const CHARSET_INFO * const cs)
44
const uint Field_varstring::MAX_SIZE= UINT16_MAX;
47
Save the field metadata for varstring fields.
49
Saves the field length in the first byte. Note: may consume
50
2 bytes. Caller must ensure second byte is contiguous with
51
first byte (e.g. array index 0,1).
53
@param metadata_ptr First byte of field metadata
55
@returns number of bytes written to metadata_ptr
57
int Field_varstring::do_save_field_metadata(uchar *metadata_ptr)
59
char *ptr= (char *)metadata_ptr;
60
assert(field_length <= 65535);
61
int2store(ptr, field_length);
65
int Field_varstring::store(const char *from,uint length, const CHARSET_INFO * const cs)
86
68
const char *well_formed_error_pos;
87
69
const char *cannot_convert_error_pos;
88
70
const char *from_end_pos;
90
ASSERT_COLUMN_MARKED_FOR_WRITE;
92
72
copy_length= well_formed_copy_nchars(field_charset,
93
73
(char*) ptr + length_bytes,
144
121
char *end_not_used;
147
ASSERT_COLUMN_MARKED_FOR_READ;
149
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
122
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
151
123
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
152
124
&end_not_used, ¬_used);
155
String *Field_varstring::val_str(String *,
127
String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
158
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
160
ASSERT_COLUMN_MARKED_FOR_READ;
130
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
162
131
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
168
type::Decimal *Field_varstring::val_decimal(type::Decimal *decimal_value)
136
my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value)
172
ASSERT_COLUMN_MARKED_FOR_READ;
174
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
176
decimal_value->store(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length, charset());
138
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
139
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
140
charset(), decimal_value);
178
141
return decimal_value;
182
int Field_varstring::cmp_max(const unsigned char *a_ptr, const unsigned char *b_ptr,
145
int Field_varstring::cmp_max(const uchar *a_ptr, const uchar *b_ptr,
185
uint32_t a_length, b_length;
148
uint a_length, b_length;
188
151
if (length_bytes == 1)
190
a_length= (uint32_t) *a_ptr;
191
b_length= (uint32_t) *b_ptr;
153
a_length= (uint) *a_ptr;
154
b_length= (uint) *b_ptr;
213
176
varstring and blob keys are ALWAYS stored with a 2 byte length prefix
216
int Field_varstring::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
179
int Field_varstring::key_cmp(const uchar *key_ptr, uint max_key_length)
218
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
219
uint32_t local_char_length= max_key_length / field_charset->mbmaxlen;
181
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
182
uint local_char_length= max_key_length / field_charset->mbmaxlen;
221
184
local_char_length= my_charpos(field_charset, ptr + length_bytes,
222
ptr + length_bytes + length, local_char_length);
185
ptr + length_bytes + length, local_char_length);
223
186
set_if_smaller(length, local_char_length);
224
return field_charset->coll->strnncollsp(field_charset,
187
return field_charset->coll->strnncollsp(field_charset,
225
188
ptr + length_bytes,
305
273
Here the number of length bytes are depending on the given max_length
308
unsigned char *Field_varstring::pack(unsigned char *to, const unsigned char *from,
276
uchar *Field_varstring::pack(uchar *to, const uchar *from,
278
bool low_byte_first __attribute__((unused)))
312
uint32_t length= length_bytes == 1 ? (uint32_t) *from : uint2korr(from);
280
uint length= length_bytes == 1 ? (uint) *from : uint2korr(from);
313
281
set_if_smaller(max_length, field_length);
314
282
if (length > max_length)
315
283
length=max_length;
298
Field_varstring::pack_key(uchar *to, const uchar *key, uint max_length,
299
bool low_byte_first __attribute__((unused)))
301
uint length= length_bytes == 1 ? (uint) *key : uint2korr(key);
302
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
303
max_length/field_charset->mbmaxlen : max_length);
305
if (length > local_char_length)
307
local_char_length= my_charpos(field_charset, key, key+length,
309
set_if_smaller(length, local_char_length);
311
*to++= (char) (length & 255);
312
if (max_length > 255)
313
*to++= (char) (length >> 8);
315
memcpy(to, key, length);
321
Unpack a key into a record buffer.
323
A VARCHAR key has a maximum size of 64K-1.
324
In its packed form, the length field is one or two bytes long,
325
depending on 'max_length'.
327
@param to Pointer into the record buffer.
328
@param key Pointer to the packed key.
329
@param max_length Key length limit from key description.
332
Pointer to end of 'key' (To the next key part if multi-segment key)
336
Field_varstring::unpack_key(uchar *to __attribute__((unused)),
337
const uchar *key, uint max_length,
338
bool low_byte_first __attribute__((unused)))
340
/* get length of the blob key */
341
uint32_t length= *key++;
342
if (max_length > 255)
343
length+= (*key++) << 8;
345
/* put the length into the record buffer */
346
if (length_bytes == 1)
347
*ptr= (uchar) length;
349
int2store(ptr, length);
350
memcpy(ptr + length_bytes, key, length);
355
Create a packed key that will be used for storage in the index tree.
357
@param to Store packed key segment here
358
@param from Key segment (as given to index_read())
359
@param max_length Max length of key
366
Field_varstring::pack_key_from_key_image(uchar *to, const uchar *from, uint max_length,
367
bool low_byte_first __attribute__((unused)))
369
/* Key length is always stored as 2 bytes */
370
uint length= uint2korr(from);
371
if (length > max_length)
373
*to++= (char) (length & 255);
374
if (max_length > 255)
375
*to++= (char) (length >> 8);
377
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
330
383
Unpack a varstring field from row data.
336
389
The string length is always packed little-endian.
338
391
@param to Destination of the data
339
392
@param from Source of the data
340
393
@param param_data Length bytes from the master's field data
342
395
@return New pointer into memory based on from + length of the data
344
const unsigned char *
345
Field_varstring::unpack(unsigned char *to, const unsigned char *from,
398
Field_varstring::unpack(uchar *to, const uchar *from,
400
bool low_byte_first __attribute__((unused)))
350
uint32_t l_bytes= (param_data && (param_data < field_length)) ?
403
uint l_bytes= (param_data && (param_data < field_length)) ?
351
404
(param_data <= 255) ? 1 : 2 : length_bytes;
352
405
if (l_bytes == 1)
371
uint32_t Field_varstring::max_packed_col_length(uint32_t max_length)
424
int Field_varstring::pack_cmp(const uchar *a, const uchar *b,
426
bool insert_or_update)
428
uint a_length, b_length;
429
if (key_length_arg > 255)
431
a_length=uint2korr(a); a+= 2;
432
b_length=uint2korr(b); b+= 2;
436
a_length= (uint) *a++;
437
b_length= (uint) *b++;
439
return field_charset->coll->strnncollsp(field_charset,
446
int Field_varstring::pack_cmp(const uchar *b, uint key_length_arg,
447
bool insert_or_update)
449
uchar *a= ptr+ length_bytes;
450
uint a_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
452
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
453
key_length_arg / field_charset->mbmaxlen :
456
if (key_length_arg > 255)
458
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
461
b_length= (uint) *b++;
463
if (a_length > local_char_length)
465
local_char_length= my_charpos(field_charset, a, a+a_length,
467
set_if_smaller(a_length, local_char_length);
470
return field_charset->coll->strnncollsp(field_charset,
477
uint Field_varstring::packed_col_length(const uchar *data_ptr, uint length)
480
return uint2korr(data_ptr)+2;
481
return (uint) *data_ptr + 1;
485
uint Field_varstring::max_packed_col_length(uint max_length)
373
487
return (max_length > 255 ? 2 : 1)+max_length;
376
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff, uint32_t length)
378
/* Key is always stored with 2 bytes */
379
const uint32_t key_len= 2;
380
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
381
uint32_t local_char_length= length / field_charset->mbmaxlen;
382
unsigned char *pos= ptr+length_bytes;
383
local_char_length= my_charpos(field_charset, pos, pos + f_length,
385
set_if_smaller(f_length, local_char_length);
386
unsigned char len_buff[key_len];
387
int2store(len_buff,f_length);
388
buff.append(len_buff);
389
buff.append(pos, f_length);
390
if (f_length < length)
393
Must clear this as we do a memcmp in optimizer/range.cc to detect
396
buff.append(length-f_length, 0);
398
return key_len+f_length;
402
uint32_t Field_varstring::get_key_image(unsigned char *buff, uint32_t length)
404
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
405
uint32_t local_char_length= length / field_charset->mbmaxlen;
406
unsigned char *pos= ptr+length_bytes;
490
uint Field_varstring::get_key_image(uchar *buff,
492
imagetype type __attribute__((unused)))
494
uint f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
495
uint local_char_length= length / field_charset->mbmaxlen;
496
uchar *pos= ptr+length_bytes;
407
497
local_char_length= my_charpos(field_charset, pos, pos + f_length,
408
498
local_char_length);
409
499
set_if_smaller(f_length, local_char_length);
421
511
return HA_KEY_BLOB_LENGTH+f_length;
424
void Field_varstring::set_key_image(const unsigned char *buff, uint32_t length)
515
void Field_varstring::set_key_image(const uchar *buff,uint length)
426
517
length= uint2korr(buff); // Real length is here
427
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
518
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
430
int Field_varstring::cmp_binary(const unsigned char *a_ptr,
431
const unsigned char *b_ptr,
523
int Field_varstring::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
432
524
uint32_t max_length)
434
526
uint32_t a_length,b_length;
436
528
if (length_bytes == 1)
438
a_length= (uint32_t) *a_ptr;
439
b_length= (uint32_t) *b_ptr;
530
a_length= (uint) *a_ptr;
531
b_length= (uint) *b_ptr;
482
} /* namespace drizzled */
575
uint Field_varstring::is_equal(Create_field *new_field)
577
if (new_field->sql_type == real_type() &&
578
new_field->charset == field_charset)
580
if (new_field->length == max_display_length())
582
if (new_field->length > max_display_length() &&
583
((new_field->length <= 255 && max_display_length() <= 255) ||
584
(new_field->length > 255 && max_display_length() > 255)))
585
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
591
void Field_varstring::hash(uint32_t *nr, uint32_t *nr2)
595
*nr^= (*nr << 1) | 1;
599
uint32_t len= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
600
const CHARSET_INFO * const cs= charset();
601
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);