15
15
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16
16
MA 02111-1307, USA */
18
#include "mysys_priv.h"
20
#include <mystrings/m_ctype.h>
21
#include <drizzled/base.h>
18
#include <my_global.h>
22
21
#include <my_handler.h>
23
22
#include <my_sys.h>
24
#include "mysys_priv.h"
25
25
#include "my_handler_errors.h"
28
Swap the contents of two variables.
30
#define swap_variables(TYPE, a, b) \
38
#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1)
41
int ha_compare_text(const CHARSET_INFO * const charset_info, unsigned char *a, uint32_t a_length,
42
unsigned char *b, uint32_t b_length, bool part_key,
27
int ha_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length,
28
uchar *b, uint b_length, my_bool part_key,
29
my_bool skip_end_space)
46
32
return charset_info->coll->strnncollsp(charset_info, a, a_length,
47
b, b_length, (bool)!skip_end_space);
33
b, b_length, (my_bool)!skip_end_space);
48
34
return charset_info->coll->strnncoll(charset_info, a, a_length,
49
35
b, b_length, part_key);
53
static int compare_bin(unsigned char *a, uint32_t a_length, unsigned char *b, uint32_t b_length,
54
bool part_key, bool skip_end_space)
39
static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
40
my_bool part_key, my_bool skip_end_space)
56
uint32_t length= cmin(a_length,b_length);
57
unsigned char *end= a+ length;
42
uint length= min(a_length,b_length);
43
uchar *end= a+ length;
134
120
#define FCMP(A,B) ((int) (A) - (int) (B))
136
int ha_key_cmp(register HA_KEYSEG *keyseg, register unsigned char *a,
137
register unsigned char *b, uint32_t key_length, uint32_t nextflag,
122
int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
123
register uchar *b, uint key_length, uint nextflag,
146
uint32_t next_key_length;
147
unsigned char *orig_b= b;
132
uint next_key_length;
150
136
for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
153
uint32_t piks=! (keyseg->flag & HA_NO_SORT);
139
uint piks=! (keyseg->flag & HA_NO_SORT);
155
141
diff_pos[1]= (uint)(b - orig_b);
181
167
continue; /* To next key part */
184
end= a+ cmin(keyseg->length,key_length);
170
end= a+ min(keyseg->length,key_length);
185
171
next_key_length=key_length-keyseg->length;
187
173
switch ((enum ha_base_keytype) keyseg->type) {
197
183
(flag=ha_compare_text(keyseg->charset,a,a_length,b,b_length,
198
(bool) ((nextflag & SEARCH_PREFIX) &&
184
(my_bool) ((nextflag & SEARCH_PREFIX) &&
199
185
next_key_length <= 0),
200
(bool)!(nextflag & SEARCH_PREFIX))))
186
(my_bool)!(nextflag & SEARCH_PREFIX))))
201
187
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
208
uint32_t length=(uint) (end-a), a_length=length, b_length=length;
194
uint length=(uint) (end-a), a_length=length, b_length=length;
210
196
(flag= ha_compare_text(keyseg->charset, a, a_length, b, b_length,
211
(bool) ((nextflag & SEARCH_PREFIX) &&
197
(my_bool) ((nextflag & SEARCH_PREFIX) &&
212
198
next_key_length <= 0),
213
(bool)!(nextflag & SEARCH_PREFIX))))
199
(my_bool)!(nextflag & SEARCH_PREFIX))))
214
200
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
229
215
(flag=compare_bin(a,a_length,b,b_length,
230
(bool) ((nextflag & SEARCH_PREFIX) &&
216
(my_bool) ((nextflag & SEARCH_PREFIX) &&
231
217
next_key_length <= 0),1)))
232
218
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
239
uint32_t length=keyseg->length;
225
uint length=keyseg->length;
241
227
(flag=compare_bin(a,length,b,length,
242
(bool) ((nextflag & SEARCH_PREFIX) &&
228
(my_bool) ((nextflag & SEARCH_PREFIX) &&
243
229
next_key_length <= 0),0)))
244
230
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
258
244
(flag= ha_compare_text(keyseg->charset,a,a_length,b,b_length,
259
(bool) ((nextflag & SEARCH_PREFIX) &&
245
(my_bool) ((nextflag & SEARCH_PREFIX) &&
260
246
next_key_length <= 0),
261
(bool) ((nextflag & (SEARCH_FIND |
247
(my_bool) ((nextflag & (SEARCH_FIND |
262
248
SEARCH_UPDATE)) ==
264
250
! (keyseg->flag &
281
267
(flag=compare_bin(a,a_length,b,b_length,
282
(bool) ((nextflag & SEARCH_PREFIX) &&
268
(my_bool) ((nextflag & SEARCH_PREFIX) &&
283
269
next_key_length <= 0), 0)))
284
270
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
382
368
if (keyseg->flag & HA_REVERSE_SORT)
384
swap_variables(unsigned char*, a, b);
370
swap_variables(uchar*, a, b);
385
371
swap_flag=1; /* Remember swap of a & b */
386
372
end= a+ (int) (end-b);
409
swap_variables(unsigned char*, a, b);
395
swap_variables(uchar*, a, b);
410
396
swap_variables(int, alength, blength);
411
397
swap_flag=1-swap_flag;
412
398
alength--; blength--;
437
423
if (swap_flag) /* Restore pointers */
438
swap_variables(unsigned char*, a, b);
424
swap_variables(uchar*, a, b);
441
427
case HA_KEYTYPE_LONGLONG:
444
430
ll_a= mi_sint8korr(a);
445
431
ll_b= mi_sint8korr(b);
446
432
if (piks && (flag = CMP_NUM(ll_a,ll_b)))
595
581
that every HA_ERR_xxx constant has a corresponding error message in
596
582
handler_error_messages[] list (check mysys/ma_handler_errors.h and
597
583
include/my_base.h).
599
TODO: Remove fix the handler_error_messages so that this hack isn't
603
char compile_time_assert[(HA_ERR_FIRST +
604
array_elements(handler_error_messages) ==
605
HA_ERR_LAST + 1) ? 1 : -1]
606
__attribute__ ((__unused__));
585
compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) ==
608
587
my_error_register(handler_error_messages, HA_ERR_FIRST,
609
588
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);