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>
25
24
#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,
26
int ha_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length,
27
uchar *b, uint b_length, my_bool part_key,
28
my_bool skip_end_space)
46
31
return charset_info->coll->strnncollsp(charset_info, a, a_length,
47
b, b_length, (bool)!skip_end_space);
32
b, b_length, (my_bool)!skip_end_space);
48
33
return charset_info->coll->strnncoll(charset_info, a, a_length,
49
34
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)
38
static int compare_bin(uchar *a, uint a_length, uchar *b, uint b_length,
39
my_bool part_key, my_bool skip_end_space)
56
uint32_t length= cmin(a_length,b_length);
57
unsigned char *end= a+ length;
41
uint length= min(a_length,b_length);
42
uchar *end= a+ length;
134
119
#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,
121
int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
122
register uchar *b, uint key_length, uint nextflag,
146
uint32_t next_key_length;
147
unsigned char *orig_b= b;
131
uint next_key_length;
150
135
for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
153
uint32_t piks=! (keyseg->flag & HA_NO_SORT);
138
uint piks=! (keyseg->flag & HA_NO_SORT);
155
140
diff_pos[1]= (uint)(b - orig_b);
181
166
continue; /* To next key part */
184
end= a+ cmin(keyseg->length,key_length);
169
end= a+ min(keyseg->length,key_length);
185
170
next_key_length=key_length-keyseg->length;
187
172
switch ((enum ha_base_keytype) keyseg->type) {
197
182
(flag=ha_compare_text(keyseg->charset,a,a_length,b,b_length,
198
(bool) ((nextflag & SEARCH_PREFIX) &&
183
(my_bool) ((nextflag & SEARCH_PREFIX) &&
199
184
next_key_length <= 0),
200
(bool)!(nextflag & SEARCH_PREFIX))))
185
(my_bool)!(nextflag & SEARCH_PREFIX))))
201
186
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
208
uint32_t length=(uint) (end-a), a_length=length, b_length=length;
193
uint length=(uint) (end-a), a_length=length, b_length=length;
210
195
(flag= ha_compare_text(keyseg->charset, a, a_length, b, b_length,
211
(bool) ((nextflag & SEARCH_PREFIX) &&
196
(my_bool) ((nextflag & SEARCH_PREFIX) &&
212
197
next_key_length <= 0),
213
(bool)!(nextflag & SEARCH_PREFIX))))
198
(my_bool)!(nextflag & SEARCH_PREFIX))))
214
199
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
229
214
(flag=compare_bin(a,a_length,b,b_length,
230
(bool) ((nextflag & SEARCH_PREFIX) &&
215
(my_bool) ((nextflag & SEARCH_PREFIX) &&
231
216
next_key_length <= 0),1)))
232
217
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
239
uint32_t length=keyseg->length;
224
uint length=keyseg->length;
241
226
(flag=compare_bin(a,length,b,length,
242
(bool) ((nextflag & SEARCH_PREFIX) &&
227
(my_bool) ((nextflag & SEARCH_PREFIX) &&
243
228
next_key_length <= 0),0)))
244
229
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
258
243
(flag= ha_compare_text(keyseg->charset,a,a_length,b,b_length,
259
(bool) ((nextflag & SEARCH_PREFIX) &&
244
(my_bool) ((nextflag & SEARCH_PREFIX) &&
260
245
next_key_length <= 0),
261
(bool) ((nextflag & (SEARCH_FIND |
246
(my_bool) ((nextflag & (SEARCH_FIND |
262
247
SEARCH_UPDATE)) ==
264
249
! (keyseg->flag &
281
266
(flag=compare_bin(a,a_length,b,b_length,
282
(bool) ((nextflag & SEARCH_PREFIX) &&
267
(my_bool) ((nextflag & SEARCH_PREFIX) &&
283
268
next_key_length <= 0), 0)))
284
269
return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
382
367
if (keyseg->flag & HA_REVERSE_SORT)
384
swap_variables(unsigned char*, a, b);
369
swap_variables(uchar*, a, b);
385
370
swap_flag=1; /* Remember swap of a & b */
386
371
end= a+ (int) (end-b);
409
swap_variables(unsigned char*, a, b);
394
swap_variables(uchar*, a, b);
410
395
swap_variables(int, alength, blength);
411
396
swap_flag=1-swap_flag;
412
397
alength--; blength--;
437
422
if (swap_flag) /* Restore pointers */
438
swap_variables(unsigned char*, a, b);
423
swap_variables(uchar*, a, b);
426
#ifdef HAVE_LONG_LONG
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)))
562
549
case HA_KEYTYPE_ULONG_INT:
563
550
case HA_KEYTYPE_INT24:
564
551
case HA_KEYTYPE_UINT24:
552
#ifdef HAVE_LONG_LONG
565
553
case HA_KEYTYPE_LONGLONG:
566
554
case HA_KEYTYPE_ULONGLONG:
567
556
case HA_KEYTYPE_FLOAT:
568
557
case HA_KEYTYPE_DOUBLE:
571
560
case HA_KEYTYPE_END: /* purecov: inspected */
572
561
/* keep compiler happy */
595
584
that every HA_ERR_xxx constant has a corresponding error message in
596
585
handler_error_messages[] list (check mysys/ma_handler_errors.h and
597
586
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__));
588
compile_time_assert(HA_ERR_FIRST + array_elements(handler_error_messages) ==
608
590
my_error_register(handler_error_messages, HA_ERR_FIRST,
609
591
HA_ERR_FIRST+ array_elements(handler_error_messages)-1);