1
/* - mode: c++ c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 MySQL
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include <drizzled/server_includes.h>
23
#include <drizzled/field/varstring.h>
25
/****************************************************************************
27
Data in field->ptr is stored as:
28
1 or 2 bytes length-prefix-header (from Field_varstring::length_bytes)
32
When VARCHAR is stored in a key (for handler::index_read() etc) it's always
33
stored with a 2 byte prefix. (Just like blob keys).
35
Normally length_bytes is calculated as (field_length < 256 : 1 ? 2)
36
The exception is if there is a prefix key field that is part of a long
37
VARCHAR, in which case field_length for this may be 1 but the length_bytes
39
****************************************************************************/
41
const uint32_t Field_varstring::MAX_SIZE= UINT16_MAX;
44
Save the field metadata for varstring fields.
46
Saves the field length in the first byte. Note: may consume
47
2 bytes. Caller must ensure second byte is contiguous with
48
first byte (e.g. array index 0,1).
50
@param metadata_ptr First byte of field metadata
52
@returns number of bytes written to metadata_ptr
54
int Field_varstring::do_save_field_metadata(unsigned char *metadata_ptr)
56
char *ptr= (char *)metadata_ptr;
57
assert(field_length <= 65535);
58
int2store(ptr, field_length);
62
int Field_varstring::store(const char *from,uint32_t length, const CHARSET_INFO * const cs)
65
const char *well_formed_error_pos;
66
const char *cannot_convert_error_pos;
67
const char *from_end_pos;
69
copy_length= well_formed_copy_nchars(field_charset,
70
(char*) ptr + length_bytes,
73
field_length / field_charset->mbmaxlen,
74
&well_formed_error_pos,
75
&cannot_convert_error_pos,
78
if (length_bytes == 1)
79
*ptr= (unsigned char) copy_length;
81
int2store(ptr, copy_length);
83
if (check_string_copy_error(this, well_formed_error_pos,
84
cannot_convert_error_pos, from + length, cs))
87
return report_if_important_data(from_end_pos, from + length);
91
int Field_varstring::store(int64_t nr, bool unsigned_val)
95
length= (uint) (field_charset->cset->int64_t10_to_str)(field_charset,
101
return Field_varstring::store(buff, length, field_charset);
105
double Field_varstring::val_real(void)
109
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
110
return my_strntod(field_charset, (char*) ptr+length_bytes, length,
111
&end_not_used, ¬_used);
115
int64_t Field_varstring::val_int(void)
119
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
120
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
121
&end_not_used, ¬_used);
124
String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
127
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
128
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
133
my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value)
135
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
136
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
137
charset(), decimal_value);
138
return decimal_value;
142
int Field_varstring::cmp_max(const unsigned char *a_ptr, const unsigned char *b_ptr,
145
uint32_t a_length, b_length;
148
if (length_bytes == 1)
150
a_length= (uint) *a_ptr;
151
b_length= (uint) *b_ptr;
155
a_length= uint2korr(a_ptr);
156
b_length= uint2korr(b_ptr);
158
set_if_smaller(a_length, max_len);
159
set_if_smaller(b_length, max_len);
160
diff= field_charset->coll->strnncollsp(field_charset,
173
varstring and blob keys are ALWAYS stored with a 2 byte length prefix
176
int Field_varstring::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
178
uint32_t length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
179
uint32_t local_char_length= max_key_length / field_charset->mbmaxlen;
181
local_char_length= my_charpos(field_charset, ptr + length_bytes,
182
ptr + length_bytes + length, local_char_length);
183
set_if_smaller(length, local_char_length);
184
return field_charset->coll->strnncollsp(field_charset,
189
uint2korr(key_ptr), 0);
194
Compare to key segments (always 2 byte length prefix).
197
This is used only to compare key segments created for index_read().
198
(keys are created and compared in key.cc)
201
int Field_varstring::key_cmp(const unsigned char *a,const unsigned char *b)
203
return field_charset->coll->strnncollsp(field_charset,
204
a + HA_KEY_BLOB_LENGTH,
206
b + HA_KEY_BLOB_LENGTH,
212
void Field_varstring::sort_string(unsigned char *to,uint32_t length)
214
uint32_t tot_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
216
if (field_charset == &my_charset_bin)
218
/* Store length last in high-byte order to sort longer strings first */
219
if (length_bytes == 1)
220
to[length-1]= tot_length;
222
mi_int2store(to+length-2, tot_length);
223
length-= length_bytes;
226
tot_length= my_strnxfrm(field_charset,
227
to, length, ptr + length_bytes,
229
assert(tot_length == length);
233
enum ha_base_keytype Field_varstring::key_type() const
235
enum ha_base_keytype res;
238
res= length_bytes == 1 ? HA_KEYTYPE_VARBINARY1 : HA_KEYTYPE_VARBINARY2;
240
res= length_bytes == 1 ? HA_KEYTYPE_VARTEXT1 : HA_KEYTYPE_VARTEXT2;
245
void Field_varstring::sql_type(String &res) const
247
const CHARSET_INFO * const cs=res.charset();
250
length= cs->cset->snprintf(cs,(char*) res.ptr(),
251
res.alloced_length(), "%s(%d)",
252
(has_charset() ? "varchar" : "varbinary"),
253
(int) field_length / charset()->mbmaxlen);
258
uint32_t Field_varstring::data_length()
260
return length_bytes == 1 ? (uint32_t) *ptr : uint2korr(ptr);
263
uint32_t Field_varstring::used_length()
265
return length_bytes == 1 ? 1 + (uint32_t) (unsigned char) *ptr : 2 + uint2korr(ptr);
269
Functions to create a packed row.
270
Here the number of length bytes are depending on the given max_length
273
unsigned char *Field_varstring::pack(unsigned char *to, const unsigned char *from,
275
bool low_byte_first __attribute__((unused)))
277
uint32_t length= length_bytes == 1 ? (uint) *from : uint2korr(from);
278
set_if_smaller(max_length, field_length);
279
if (length > max_length)
282
/* Length always stored little-endian */
283
*to++= length & 0xFF;
284
if (max_length > 255)
285
*to++= (length >> 8) & 0xFF;
287
/* Store bytes of string */
289
memcpy(to, from+length_bytes, length);
295
Field_varstring::pack_key(unsigned char *to, const unsigned char *key, uint32_t max_length,
296
bool low_byte_first __attribute__((unused)))
298
uint32_t length= length_bytes == 1 ? (uint) *key : uint2korr(key);
299
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
300
max_length/field_charset->mbmaxlen : max_length);
302
if (length > local_char_length)
304
local_char_length= my_charpos(field_charset, key, key+length,
306
set_if_smaller(length, local_char_length);
308
*to++= (char) (length & 255);
309
if (max_length > 255)
310
*to++= (char) (length >> 8);
312
memcpy(to, key, length);
318
Unpack a key into a record buffer.
320
A VARCHAR key has a maximum size of 64K-1.
321
In its packed form, the length field is one or two bytes long,
322
depending on 'max_length'.
324
@param to Pointer into the record buffer.
325
@param key Pointer to the packed key.
326
@param max_length Key length limit from key description.
329
Pointer to end of 'key' (To the next key part if multi-segment key)
332
const unsigned char *
333
Field_varstring::unpack_key(unsigned char *to __attribute__((unused)),
334
const unsigned char *key, uint32_t max_length,
335
bool low_byte_first __attribute__((unused)))
337
/* get length of the blob key */
338
uint32_t length= *key++;
339
if (max_length > 255)
340
length+= (*key++) << 8;
342
/* put the length into the record buffer */
343
if (length_bytes == 1)
344
*ptr= (unsigned char) length;
346
int2store(ptr, length);
347
memcpy(ptr + length_bytes, key, length);
352
Create a packed key that will be used for storage in the index tree.
354
@param to Store packed key segment here
355
@param from Key segment (as given to index_read())
356
@param max_length Max length of key
363
Field_varstring::pack_key_from_key_image(unsigned char *to, const unsigned char *from, uint32_t max_length,
364
bool low_byte_first __attribute__((unused)))
366
/* Key length is always stored as 2 bytes */
367
uint32_t length= uint2korr(from);
368
if (length > max_length)
370
*to++= (char) (length & 255);
371
if (max_length > 255)
372
*to++= (char) (length >> 8);
374
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
380
Unpack a varstring field from row data.
382
This method is used to unpack a varstring field from a master
383
whose size of the field is less than that of the slave.
386
The string length is always packed little-endian.
388
@param to Destination of the data
389
@param from Source of the data
390
@param param_data Length bytes from the master's field data
392
@return New pointer into memory based on from + length of the data
394
const unsigned char *
395
Field_varstring::unpack(unsigned char *to, const unsigned char *from,
397
bool low_byte_first __attribute__((unused)))
400
uint32_t l_bytes= (param_data && (param_data < field_length)) ?
401
(param_data <= 255) ? 1 : 2 : length_bytes;
406
if (length_bytes == 2)
409
else /* l_bytes == 2 */
411
length= uint2korr(from);
416
memcpy(to+ length_bytes, from, length);
421
int Field_varstring::pack_cmp(const unsigned char *a, const unsigned char *b,
422
uint32_t key_length_arg,
423
bool insert_or_update)
425
uint32_t a_length, b_length;
426
if (key_length_arg > 255)
428
a_length=uint2korr(a); a+= 2;
429
b_length=uint2korr(b); b+= 2;
433
a_length= (uint) *a++;
434
b_length= (uint) *b++;
436
return field_charset->coll->strnncollsp(field_charset,
443
int Field_varstring::pack_cmp(const unsigned char *b, uint32_t key_length_arg,
444
bool insert_or_update)
446
unsigned char *a= ptr+ length_bytes;
447
uint32_t a_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
449
uint32_t local_char_length= ((field_charset->mbmaxlen > 1) ?
450
key_length_arg / field_charset->mbmaxlen :
453
if (key_length_arg > 255)
455
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
458
b_length= (uint) *b++;
460
if (a_length > local_char_length)
462
local_char_length= my_charpos(field_charset, a, a+a_length,
464
set_if_smaller(a_length, local_char_length);
467
return field_charset->coll->strnncollsp(field_charset,
474
uint32_t Field_varstring::packed_col_length(const unsigned char *data_ptr, uint32_t length)
477
return uint2korr(data_ptr)+2;
478
return (uint) *data_ptr + 1;
482
uint32_t Field_varstring::max_packed_col_length(uint32_t max_length)
484
return (max_length > 255 ? 2 : 1)+max_length;
487
uint32_t Field_varstring::get_key_image(unsigned char *buff,
489
imagetype type __attribute__((unused)))
491
uint32_t f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
492
uint32_t local_char_length= length / field_charset->mbmaxlen;
493
unsigned char *pos= ptr+length_bytes;
494
local_char_length= my_charpos(field_charset, pos, pos + f_length,
496
set_if_smaller(f_length, local_char_length);
497
/* Key is always stored with 2 bytes */
498
int2store(buff,f_length);
499
memcpy(buff+HA_KEY_BLOB_LENGTH, pos, f_length);
500
if (f_length < length)
503
Must clear this as we do a memcmp in opt_range.cc to detect
506
memset(buff+HA_KEY_BLOB_LENGTH+f_length, 0, (length-f_length));
508
return HA_KEY_BLOB_LENGTH+f_length;
512
void Field_varstring::set_key_image(const unsigned char *buff,uint32_t length)
514
length= uint2korr(buff); // Real length is here
515
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
520
int Field_varstring::cmp_binary(const unsigned char *a_ptr, const unsigned char *b_ptr,
523
uint32_t a_length,b_length;
525
if (length_bytes == 1)
527
a_length= (uint) *a_ptr;
528
b_length= (uint) *b_ptr;
532
a_length= uint2korr(a_ptr);
533
b_length= uint2korr(b_ptr);
535
set_if_smaller(a_length, max_length);
536
set_if_smaller(b_length, max_length);
537
if (a_length != b_length)
539
return memcmp(a_ptr+length_bytes, b_ptr+length_bytes, a_length);
543
Field *Field_varstring::new_field(MEM_ROOT *root, Table *new_table, bool keep_type)
545
Field_varstring *res= (Field_varstring*) Field::new_field(root, new_table,
548
res->length_bytes= length_bytes;
553
Field *Field_varstring::new_key_field(MEM_ROOT *root,
555
unsigned char *new_ptr, unsigned char *new_null_ptr,
556
uint32_t new_null_bit)
558
Field_varstring *res;
559
if ((res= (Field_varstring*) Field::new_key_field(root,
565
/* Keys length prefixes are always packed with 2 bytes */
566
res->length_bytes= 2;
572
uint32_t Field_varstring::is_equal(Create_field *new_field)
574
if (new_field->sql_type == real_type() &&
575
new_field->charset == field_charset)
577
if (new_field->length == max_display_length())
579
if (new_field->length > max_display_length() &&
580
((new_field->length <= 255 && max_display_length() <= 255) ||
581
(new_field->length > 255 && max_display_length() > 255)))
582
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
588
void Field_varstring::hash(uint32_t *nr, uint32_t *nr2)
592
*nr^= (*nr << 1) | 1;
596
uint32_t len= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
597
const CHARSET_INFO * const cs= charset();
598
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);