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
23
25
#include <drizzled/field/varstring.h>
24
#include <drizzled/table.h>
25
#include <drizzled/session.h>
26
#include <plugin/myisam/myisam.h>
35
27
/****************************************************************************
49
41
****************************************************************************/
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)
43
const uint Field_varstring::MAX_SIZE= UINT16_MAX;
46
Save the field metadata for varstring fields.
48
Saves the field length in the first byte. Note: may consume
49
2 bytes. Caller must ensure second byte is contiguous with
50
first byte (e.g. array index 0,1).
52
@param metadata_ptr First byte of field metadata
54
@returns number of bytes written to metadata_ptr
56
int Field_varstring::do_save_field_metadata(uchar *metadata_ptr)
58
char *ptr= (char *)metadata_ptr;
59
assert(field_length <= 65535);
60
int2store(ptr, field_length);
64
int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
86
67
const char *well_formed_error_pos;
87
68
const char *cannot_convert_error_pos;
88
69
const char *from_end_pos;
90
ASSERT_COLUMN_MARKED_FOR_WRITE;
92
71
copy_length= well_formed_copy_nchars(field_charset,
93
72
(char*) ptr + length_bytes,
114
93
int Field_varstring::store(int64_t nr, bool unsigned_val)
118
length= (uint32_t) (field_charset->cset->int64_t10_to_str)(field_charset,
121
(unsigned_val ? 10: -10),
97
length= (uint) (field_charset->cset->int64_t10_to_str)(field_charset,
123
103
return Field_varstring::store(buff, length, field_charset);
127
double Field_varstring::val_real(void) const
107
double Field_varstring::val_real(void)
130
110
char *end_not_used;
132
ASSERT_COLUMN_MARKED_FOR_READ;
134
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
111
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
136
112
return my_strntod(field_charset, (char*) ptr+length_bytes, length,
137
113
&end_not_used, ¬_used);
141
int64_t Field_varstring::val_int(void) const
117
int64_t Field_varstring::val_int(void)
144
120
char *end_not_used;
147
ASSERT_COLUMN_MARKED_FOR_READ;
149
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
121
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
151
122
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
152
123
&end_not_used, ¬_used);
155
String *Field_varstring::val_str(String *, String *val_ptr) const
126
String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
157
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
159
ASSERT_COLUMN_MARKED_FOR_READ;
129
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
161
130
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
167
type::Decimal *Field_varstring::val_decimal(type::Decimal *decimal_value) const
135
my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value)
171
ASSERT_COLUMN_MARKED_FOR_READ;
173
length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
175
decimal_value->store(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length, charset());
137
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
138
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
139
charset(), decimal_value);
177
140
return decimal_value;
181
int Field_varstring::cmp_max(const unsigned char *a_ptr, const unsigned char *b_ptr,
144
int Field_varstring::cmp_max(const uchar *a_ptr, const uchar *b_ptr,
184
uint32_t a_length, b_length;
147
uint a_length, b_length;
187
150
if (length_bytes == 1)
189
a_length= (uint32_t) *a_ptr;
190
b_length= (uint32_t) *b_ptr;
152
a_length= (uint) *a_ptr;
153
b_length= (uint) *b_ptr;
212
175
varstring and blob keys are ALWAYS stored with a 2 byte length prefix
215
int Field_varstring::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
178
int Field_varstring::key_cmp(const uchar *key_ptr, uint max_key_length)
217
uint32_t length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
218
uint32_t local_char_length= max_key_length / field_charset->mbmaxlen;
180
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
181
uint local_char_length= max_key_length / field_charset->mbmaxlen;
220
183
local_char_length= my_charpos(field_charset, ptr + length_bytes,
221
ptr + length_bytes + length, local_char_length);
184
ptr + length_bytes + length, local_char_length);
222
185
set_if_smaller(length, local_char_length);
223
return field_charset->coll->strnncollsp(field_charset,
186
return field_charset->coll->strnncollsp(field_charset,
224
187
ptr + length_bytes,
284
247
void Field_varstring::sql_type(String &res) const
286
const CHARSET_INFO * const cs=res.charset();
249
THD *thd= table->in_use;
250
CHARSET_INFO *cs=res.charset();
289
253
length= cs->cset->snprintf(cs,(char*) res.ptr(),
290
254
res.alloced_length(), "%s(%d)",
291
255
(has_charset() ? "varchar" : "varbinary"),
292
256
(int) field_length / charset()->mbmaxlen);
293
257
res.length(length);
258
if ((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) &&
259
has_charset() && (charset()->state & MY_CS_BINSORT))
260
res.append(STRING_WITH_LEN(" binary"));
264
uint32_t Field_varstring::data_length()
266
return length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
297
269
uint32_t Field_varstring::used_length()
299
return length_bytes == 1 ? 1 + (uint32_t) (unsigned char) *ptr : 2 + uint2korr(ptr);
271
return length_bytes == 1 ? 1 + (uint32_t) (uchar) *ptr : 2 + uint2korr(ptr);
304
276
Here the number of length bytes are depending on the given max_length
307
unsigned char *Field_varstring::pack(unsigned char *to, const unsigned char *from,
279
uchar *Field_varstring::pack(uchar *to, const uchar *from,
281
bool low_byte_first __attribute__((unused)))
311
uint32_t length= length_bytes == 1 ? (uint32_t) *from : uint2korr(from);
283
uint length= length_bytes == 1 ? (uint) *from : uint2korr(from);
312
284
set_if_smaller(max_length, field_length);
313
285
if (length > max_length)
314
286
length=max_length;
301
Field_varstring::pack_key(uchar *to, const uchar *key, uint max_length,
302
bool low_byte_first __attribute__((unused)))
304
uint length= length_bytes == 1 ? (uint) *key : uint2korr(key);
305
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
306
max_length/field_charset->mbmaxlen : max_length);
308
if (length > local_char_length)
310
local_char_length= my_charpos(field_charset, key, key+length,
312
set_if_smaller(length, local_char_length);
314
*to++= (char) (length & 255);
315
if (max_length > 255)
316
*to++= (char) (length >> 8);
318
memcpy(to, key, length);
324
Unpack a key into a record buffer.
326
A VARCHAR key has a maximum size of 64K-1.
327
In its packed form, the length field is one or two bytes long,
328
depending on 'max_length'.
330
@param to Pointer into the record buffer.
331
@param key Pointer to the packed key.
332
@param max_length Key length limit from key description.
335
Pointer to end of 'key' (To the next key part if multi-segment key)
339
Field_varstring::unpack_key(uchar *to __attribute__((unused)),
340
const uchar *key, uint max_length,
341
bool low_byte_first __attribute__((unused)))
343
/* get length of the blob key */
344
uint32_t length= *key++;
345
if (max_length > 255)
346
length+= (*key++) << 8;
348
/* put the length into the record buffer */
349
if (length_bytes == 1)
350
*ptr= (uchar) length;
352
int2store(ptr, length);
353
memcpy(ptr + length_bytes, key, length);
358
Create a packed key that will be used for storage in the index tree.
360
@param to Store packed key segment here
361
@param from Key segment (as given to index_read())
362
@param max_length Max length of key
369
Field_varstring::pack_key_from_key_image(uchar *to, const uchar *from, uint max_length,
370
bool low_byte_first __attribute__((unused)))
372
/* Key length is always stored as 2 bytes */
373
uint length= uint2korr(from);
374
if (length > max_length)
376
*to++= (char) (length & 255);
377
if (max_length > 255)
378
*to++= (char) (length >> 8);
380
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
329
386
Unpack a varstring field from row data.
335
392
The string length is always packed little-endian.
337
394
@param to Destination of the data
338
395
@param from Source of the data
339
396
@param param_data Length bytes from the master's field data
341
398
@return New pointer into memory based on from + length of the data
343
const unsigned char *
344
Field_varstring::unpack(unsigned char *to, const unsigned char *from,
401
Field_varstring::unpack(uchar *to, const uchar *from,
403
bool low_byte_first __attribute__((unused)))
349
uint32_t l_bytes= (param_data && (param_data < field_length)) ?
406
uint l_bytes= (param_data && (param_data < field_length)) ?
350
407
(param_data <= 255) ? 1 : 2 : length_bytes;
351
408
if (l_bytes == 1)
370
uint32_t Field_varstring::max_packed_col_length(uint32_t max_length)
427
int Field_varstring::pack_cmp(const uchar *a, const uchar *b,
429
my_bool insert_or_update)
431
uint a_length, b_length;
432
if (key_length_arg > 255)
434
a_length=uint2korr(a); a+= 2;
435
b_length=uint2korr(b); b+= 2;
439
a_length= (uint) *a++;
440
b_length= (uint) *b++;
442
return field_charset->coll->strnncollsp(field_charset,
449
int Field_varstring::pack_cmp(const uchar *b, uint key_length_arg,
450
my_bool insert_or_update)
452
uchar *a= ptr+ length_bytes;
453
uint a_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
455
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
456
key_length_arg / field_charset->mbmaxlen :
459
if (key_length_arg > 255)
461
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
464
b_length= (uint) *b++;
466
if (a_length > local_char_length)
468
local_char_length= my_charpos(field_charset, a, a+a_length,
470
set_if_smaller(a_length, local_char_length);
473
return field_charset->coll->strnncollsp(field_charset,
480
uint Field_varstring::packed_col_length(const uchar *data_ptr, uint length)
483
return uint2korr(data_ptr)+2;
484
return (uint) *data_ptr + 1;
488
uint Field_varstring::max_packed_col_length(uint max_length)
372
490
return (max_length > 255 ? 2 : 1)+max_length;
375
uint32_t Field_varstring::get_key_image(basic_string<unsigned char> &buff, uint32_t length)
377
/* Key is always stored with 2 bytes */
378
const uint32_t key_len= 2;
379
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
380
uint32_t local_char_length= length / field_charset->mbmaxlen;
381
unsigned char *pos= ptr+length_bytes;
382
local_char_length= my_charpos(field_charset, pos, pos + f_length,
384
set_if_smaller(f_length, local_char_length);
385
unsigned char len_buff[key_len];
386
int2store(len_buff,f_length);
387
buff.append(len_buff);
388
buff.append(pos, f_length);
389
if (f_length < length)
392
Must clear this as we do a memcmp in optimizer/range.cc to detect
395
buff.append(length-f_length, 0);
397
return key_len+f_length;
401
uint32_t Field_varstring::get_key_image(unsigned char *buff, uint32_t length)
403
uint32_t f_length= length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
404
uint32_t local_char_length= length / field_charset->mbmaxlen;
405
unsigned char *pos= ptr+length_bytes;
493
uint Field_varstring::get_key_image(uchar *buff,
495
imagetype type __attribute__((unused)))
497
uint f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
498
uint local_char_length= length / field_charset->mbmaxlen;
499
uchar *pos= ptr+length_bytes;
406
500
local_char_length= my_charpos(field_charset, pos, pos + f_length,
407
501
local_char_length);
408
502
set_if_smaller(f_length, local_char_length);
420
514
return HA_KEY_BLOB_LENGTH+f_length;
423
void Field_varstring::set_key_image(const unsigned char *buff, uint32_t length)
518
void Field_varstring::set_key_image(const uchar *buff,uint length)
425
520
length= uint2korr(buff); // Real length is here
426
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
521
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
429
int Field_varstring::cmp_binary(const unsigned char *a_ptr,
430
const unsigned char *b_ptr,
526
int Field_varstring::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
431
527
uint32_t max_length)
433
529
uint32_t a_length,b_length;
435
531
if (length_bytes == 1)
437
a_length= (uint32_t) *a_ptr;
438
b_length= (uint32_t) *b_ptr;
533
a_length= (uint) *a_ptr;
534
b_length= (uint) *b_ptr;
463
Field *Field_varstring::new_key_field(memory::Root *root,
465
unsigned char *new_ptr, unsigned char *new_null_ptr,
466
uint32_t new_null_bit)
560
Field *Field_varstring::new_key_field(MEM_ROOT *root,
561
struct st_table *new_table,
562
uchar *new_ptr, uchar *new_null_ptr,
468
565
Field_varstring *res;
469
566
if ((res= (Field_varstring*) Field::new_key_field(root,
481
} /* namespace drizzled */
579
uint Field_varstring::is_equal(Create_field *new_field)
581
if (new_field->sql_type == real_type() &&
582
new_field->charset == field_charset)
584
if (new_field->length == max_display_length())
586
if (new_field->length > max_display_length() &&
587
((new_field->length <= 255 && max_display_length() <= 255) ||
588
(new_field->length > 255 && max_display_length() > 255)))
589
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
595
void Field_varstring::hash(ulong *nr, ulong *nr2)
599
*nr^= (*nr << 1) | 1;
603
uint len= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
604
CHARSET_INFO *cs= charset();
605
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);