~drizzle-trunk/drizzle/development

547 by Monty Taylor
Moved handler_error_messages array out of header file. Moved associated
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
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; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
1 by brian
clean slate
19
612.2.4 by Monty Taylor
Moved some defines to config.h. Stopped including config.h directly anywhere.
20
#include <drizzled/global.h>
212.5.39 by Monty Taylor
Phew. Moved my_base and my_global.
21
212.5.18 by Monty Taylor
Moved m_ctype, m_string and my_bitmap. Removed t_ctype.
22
#include <mystrings/m_ctype.h>
212.5.39 by Monty Taylor
Phew. Moved my_base and my_global.
23
#include <drizzled/base.h>
992.1.25 by Monty Taylor
Moved myisam to new plugin system.
24
#include <plugin/myisam/my_handler.h>
548 by Monty Taylor
Moved my_handler to myisam, which is where it actually belongs.
25
#include <mysys/my_sys.h>
1 by brian
clean slate
26
1067.4.8 by Nathan Williams
Converted all usages of cmin/cmax in plugin directory to std::min/max.
27
#include <algorithm>
28
29
using namespace std;
30
322.2.2 by Mats Kindahl
Hiding THD::proc_info field and providing a setter and getter.
31
/**
32
  Swap the contents of two variables.
33
 */
34
#define swap_variables(TYPE, a, b) \
35
  do {                             \
36
    TYPE dummy;                    \
37
    dummy= a;                      \
38
    a= b;                          \
39
    b= dummy;                      \
40
  } while (0)
41
398.1.9 by Monty Taylor
Cleaned up stuff out of global.h.
42
#define CMP_NUM(a,b) (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1)
43
44
482 by Brian Aker
Remove uint.
45
int ha_compare_text(const CHARSET_INFO * const charset_info, unsigned char *a, uint32_t a_length,
46
		    unsigned char *b, uint32_t b_length, bool part_key,
146 by Brian Aker
my_bool cleanup.
47
		    bool skip_end_space)
1 by brian
clean slate
48
{
49
  if (!part_key)
50
    return charset_info->coll->strnncollsp(charset_info, a, a_length,
146 by Brian Aker
my_bool cleanup.
51
                                           b, b_length, (bool)!skip_end_space);
1 by brian
clean slate
52
  return charset_info->coll->strnncoll(charset_info, a, a_length,
53
                                       b, b_length, part_key);
54
}
55
56
482 by Brian Aker
Remove uint.
57
static int compare_bin(unsigned char *a, uint32_t a_length, unsigned char *b, uint32_t b_length,
146 by Brian Aker
my_bool cleanup.
58
                       bool part_key, bool skip_end_space)
1 by brian
clean slate
59
{
1067.4.8 by Nathan Williams
Converted all usages of cmin/cmax in plugin directory to std::min/max.
60
  uint32_t length= min(a_length,b_length);
481 by Brian Aker
Remove all of uchar.
61
  unsigned char *end= a+ length;
1 by brian
clean slate
62
  int flag;
63
64
  while (a < end)
65
    if ((flag= (int) *a++ - (int) *b++))
66
      return flag;
67
  if (part_key && b_length < a_length)
68
    return 0;
69
  if (skip_end_space && a_length != b_length)
70
  {
71
    int swap= 1;
72
    /*
73
      We are using space compression. We have to check if longer key
74
      has next character < ' ', in which case it's less than the shorter
75
      key that has an implicite space afterwards.
76
77
      This code is identical to the one in
78
      strings/ctype-simple.c:my_strnncollsp_simple
79
    */
80
    if (a_length < b_length)
81
    {
82
      /* put shorter key in a */
83
      a_length= b_length;
84
      a= b;
85
      swap= -1;					/* swap sign of result */
86
    }
87
    for (end= a + a_length-length; a < end ; a++)
88
    {
89
      if (*a != ' ')
90
	return (*a < ' ') ? -swap : swap;
91
    }
92
    return 0;
93
  }
94
  return (int) (a_length-b_length);
95
}
96
97
98
/*
99
  Compare two keys
100
101
  SYNOPSIS
102
    ha_key_cmp()
103
    keyseg	Array of key segments of key to compare
104
    a		First key to compare, in format from _mi_pack_key()
105
		This is normally key specified by user
106
    b		Second key to compare.  This is always from a row
107
    key_length	Length of key to compare.  This can be shorter than
108
		a to just compare sub keys
109
    next_flag	How keys should be compared
110
		If bit SEARCH_FIND is not set the keys includes the row
111
		position and this should also be compared
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
112
    diff_pos    OUT Number of first keypart where values differ, counting
1 by brian
clean slate
113
                from one.
114
    diff_pos[1] OUT  (b + diff_pos[1]) points to first value in tuple b
115
                      that is different from corresponding value in tuple a.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
116
117
  EXAMPLES
1 by brian
clean slate
118
   Example1: if the function is called for tuples
119
     ('aaa','bbb') and ('eee','fff'), then
120
     diff_pos[0] = 1 (as 'aaa' != 'eee')
121
     diff_pos[1] = 0 (offset from beggining of tuple b to 'eee' keypart).
122
123
   Example2: if the index function is called for tuples
124
     ('aaa','bbb') and ('aaa','fff'),
125
     diff_pos[0] = 2 (as 'aaa' != 'eee')
126
     diff_pos[1] = 3 (offset from beggining of tuple b to 'fff' keypart,
127
                      here we assume that first key part is CHAR(3) NOT NULL)
128
129
  NOTES
130
    Number-keys can't be splited
131
132
  RETURN VALUES
133
    <0	If a < b
134
    0	If a == b
135
    >0	If a > b
136
*/
137
138
#define FCMP(A,B) ((int) (A) - (int) (B))
139
481 by Brian Aker
Remove all of uchar.
140
int ha_key_cmp(register HA_KEYSEG *keyseg, register unsigned char *a,
482 by Brian Aker
Remove uint.
141
	       register unsigned char *b, uint32_t key_length, uint32_t nextflag,
142
	       uint32_t *diff_pos)
1 by brian
clean slate
143
{
144
  int flag;
206 by Brian Aker
Removed final uint dead types.
145
  int16_t s_1,s_2;
205 by Brian Aker
uint32 -> uin32_t
146
  int32_t l_1,l_2;
147
  uint32_t u_1,u_2;
1 by brian
clean slate
148
  float f_1,f_2;
149
  double d_1,d_2;
482 by Brian Aker
Remove uint.
150
  uint32_t next_key_length;
481 by Brian Aker
Remove all of uchar.
151
  unsigned char *orig_b= b;
1 by brian
clean slate
152
153
  *diff_pos=0;
154
  for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
155
  {
481 by Brian Aker
Remove all of uchar.
156
    unsigned char *end;
482 by Brian Aker
Remove uint.
157
    uint32_t piks=! (keyseg->flag & HA_NO_SORT);
1 by brian
clean slate
158
    (*diff_pos)++;
159
    diff_pos[1]= (uint)(b - orig_b);
160
161
    /* Handle NULL part */
162
    if (keyseg->null_bit)
163
    {
164
      key_length--;
165
      if (*a != *b && piks)
166
      {
167
        flag = (int) *a - (int) *b;
168
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
169
      }
170
      b++;
171
      if (!*a++)                                /* If key was NULL */
172
      {
173
        if (nextflag == (SEARCH_FIND | SEARCH_UPDATE))
174
          nextflag=SEARCH_SAME;                 /* Allow duplicate keys */
175
  	else if (nextflag & SEARCH_NULL_ARE_NOT_EQUAL)
176
	{
177
	  /*
178
	    This is only used from mi_check() to calculate cardinality.
179
	    It can't be used when searching for a key as this would cause
180
	    compare of (a,b) and (b,a) to return the same value.
181
	  */
182
	  return -1;
183
	}
184
        next_key_length=key_length;
185
        continue;                               /* To next key part */
186
      }
187
    }
1067.4.8 by Nathan Williams
Converted all usages of cmin/cmax in plugin directory to std::min/max.
188
    end= a+ min((uint32_t)keyseg->length,key_length);
1 by brian
clean slate
189
    next_key_length=key_length-keyseg->length;
190
191
    switch ((enum ha_base_keytype) keyseg->type) {
192
    case HA_KEYTYPE_TEXT:                       /* Ascii; Key is converted */
193
      if (keyseg->flag & HA_SPACE_PACK)
194
      {
195
        int a_length,b_length,pack_length;
196
        get_key_length(a_length,a);
197
        get_key_pack_length(b_length,pack_length,b);
198
        next_key_length=key_length-b_length-pack_length;
199
200
        if (piks &&
201
            (flag=ha_compare_text(keyseg->charset,a,a_length,b,b_length,
146 by Brian Aker
my_bool cleanup.
202
				  (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
203
					     next_key_length <= 0),
146 by Brian Aker
my_bool cleanup.
204
				  (bool)!(nextflag & SEARCH_PREFIX))))
1 by brian
clean slate
205
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
206
        a+=a_length;
207
        b+=b_length;
208
        break;
209
      }
210
      else
211
      {
482 by Brian Aker
Remove uint.
212
	uint32_t length=(uint) (end-a), a_length=length, b_length=length;
1 by brian
clean slate
213
        if (piks &&
214
            (flag= ha_compare_text(keyseg->charset, a, a_length, b, b_length,
146 by Brian Aker
my_bool cleanup.
215
				   (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
216
					      next_key_length <= 0),
146 by Brian Aker
my_bool cleanup.
217
				   (bool)!(nextflag & SEARCH_PREFIX))))
1 by brian
clean slate
218
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
219
        a=end;
220
        b+=length;
221
      }
222
      break;
223
    case HA_KEYTYPE_BINARY:
224
    case HA_KEYTYPE_BIT:
225
      if (keyseg->flag & HA_SPACE_PACK)
226
      {
227
        int a_length,b_length,pack_length;
228
        get_key_length(a_length,a);
229
        get_key_pack_length(b_length,pack_length,b);
230
        next_key_length=key_length-b_length-pack_length;
231
232
        if (piks &&
233
	    (flag=compare_bin(a,a_length,b,b_length,
146 by Brian Aker
my_bool cleanup.
234
                              (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
235
                                         next_key_length <= 0),1)))
236
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
237
        a+=a_length;
238
        b+=b_length;
239
        break;
240
      }
241
      else
242
      {
482 by Brian Aker
Remove uint.
243
        uint32_t length=keyseg->length;
1 by brian
clean slate
244
        if (piks &&
245
	    (flag=compare_bin(a,length,b,length,
146 by Brian Aker
my_bool cleanup.
246
                              (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
247
                                         next_key_length <= 0),0)))
248
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
249
        a+=length;
250
        b+=length;
251
      }
252
      break;
253
    case HA_KEYTYPE_VARTEXT1:
254
    case HA_KEYTYPE_VARTEXT2:
255
      {
256
        int a_length,b_length,pack_length;
257
        get_key_length(a_length,a);
258
        get_key_pack_length(b_length,pack_length,b);
259
        next_key_length=key_length-b_length-pack_length;
260
261
        if (piks &&
262
	    (flag= ha_compare_text(keyseg->charset,a,a_length,b,b_length,
146 by Brian Aker
my_bool cleanup.
263
                                   (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
264
                                              next_key_length <= 0),
146 by Brian Aker
my_bool cleanup.
265
				   (bool) ((nextflag & (SEARCH_FIND |
1 by brian
clean slate
266
							   SEARCH_UPDATE)) ==
267
					      SEARCH_FIND &&
268
                                              ! (keyseg->flag &
269
                                                 HA_END_SPACE_ARE_EQUAL)))))
270
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
271
        a+= a_length;
272
        b+= b_length;
273
        break;
274
      }
275
    case HA_KEYTYPE_VARBINARY1:
276
    case HA_KEYTYPE_VARBINARY2:
277
      {
278
        int a_length,b_length,pack_length;
279
        get_key_length(a_length,a);
280
        get_key_pack_length(b_length,pack_length,b);
281
        next_key_length=key_length-b_length-pack_length;
282
283
        if (piks &&
284
	    (flag=compare_bin(a,a_length,b,b_length,
146 by Brian Aker
my_bool cleanup.
285
                              (bool) ((nextflag & SEARCH_PREFIX) &&
1 by brian
clean slate
286
                                         next_key_length <= 0), 0)))
287
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
288
        a+=a_length;
289
        b+=b_length;
290
        break;
291
      }
292
    case HA_KEYTYPE_INT8:
293
    {
294
      int i_1= (int) *((signed char*) a);
295
      int i_2= (int) *((signed char*) b);
296
      if (piks && (flag = CMP_NUM(i_1,i_2)))
297
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
298
      a= end;
299
      b++;
300
      break;
301
    }
302
    case HA_KEYTYPE_SHORT_INT:
303
      s_1= mi_sint2korr(a);
304
      s_2= mi_sint2korr(b);
305
      if (piks && (flag = CMP_NUM(s_1,s_2)))
306
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
307
      a=  end;
308
      b+= 2; /* sizeof(short int); */
309
      break;
310
    case HA_KEYTYPE_USHORT_INT:
311
      {
206 by Brian Aker
Removed final uint dead types.
312
        uint16_t us_1,us_2;
1 by brian
clean slate
313
        us_1= mi_sint2korr(a);
314
        us_2= mi_sint2korr(b);
315
        if (piks && (flag = CMP_NUM(us_1,us_2)))
316
          return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
317
        a=  end;
318
        b+=2; /* sizeof(short int); */
319
        break;
320
      }
321
    case HA_KEYTYPE_LONG_INT:
322
      l_1= mi_sint4korr(a);
323
      l_2= mi_sint4korr(b);
324
      if (piks && (flag = CMP_NUM(l_1,l_2)))
325
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
326
      a=  end;
327
      b+= 4; /* sizeof(long int); */
328
      break;
329
    case HA_KEYTYPE_ULONG_INT:
330
      u_1= mi_sint4korr(a);
331
      u_2= mi_sint4korr(b);
332
      if (piks && (flag = CMP_NUM(u_1,u_2)))
333
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
334
      a=  end;
335
      b+= 4; /* sizeof(long int); */
336
      break;
337
    case HA_KEYTYPE_INT24:
338
      l_1=mi_sint3korr(a);
339
      l_2=mi_sint3korr(b);
340
      if (piks && (flag = CMP_NUM(l_1,l_2)))
341
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
342
      a=  end;
343
      b+= 3;
344
      break;
345
    case HA_KEYTYPE_UINT24:
346
      l_1=mi_uint3korr(a);
347
      l_2=mi_uint3korr(b);
348
      if (piks && (flag = CMP_NUM(l_1,l_2)))
349
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
350
      a=  end;
351
      b+= 3;
352
      break;
353
    case HA_KEYTYPE_FLOAT:
354
      mi_float4get(f_1,a);
355
      mi_float4get(f_2,b);
356
      /*
357
        The following may give a compiler warning about floating point
358
        comparison not being safe, but this is ok in this context as
359
        we are bascily doing sorting
360
      */
361
      if (piks && (flag = CMP_NUM(f_1,f_2)))
362
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
363
      a=  end;
364
      b+= 4; /* sizeof(float); */
365
      break;
366
    case HA_KEYTYPE_DOUBLE:
367
      mi_float8get(d_1,a);
368
      mi_float8get(d_2,b);
369
      /*
370
        The following may give a compiler warning about floating point
371
        comparison not being safe, but this is ok in this context as
372
        we are bascily doing sorting
373
      */
374
      if (piks && (flag = CMP_NUM(d_1,d_2)))
375
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
376
      a=  end;
377
      b+= 8;  /* sizeof(double); */
378
      break;
379
    case HA_KEYTYPE_NUM:                                /* Numeric key */
380
    {
381
      int swap_flag= 0;
382
      int alength,blength;
383
384
      if (keyseg->flag & HA_REVERSE_SORT)
385
      {
481 by Brian Aker
Remove all of uchar.
386
        swap_variables(unsigned char*, a, b);
1 by brian
clean slate
387
        swap_flag=1;                            /* Remember swap of a & b */
388
        end= a+ (int) (end-b);
389
      }
390
      if (keyseg->flag & HA_SPACE_PACK)
391
      {
392
        alength= *a++; blength= *b++;
393
        end=a+alength;
394
        next_key_length=key_length-blength-1;
395
      }
396
      else
397
      {
398
        alength= (int) (end-a);
399
        blength=keyseg->length;
400
        /* remove pre space from keys */
401
        for ( ; alength && *a == ' ' ; a++, alength--) ;
402
        for ( ; blength && *b == ' ' ; b++, blength--) ;
403
      }
404
      if (piks)
405
      {
406
	if (*a == '-')
407
	{
408
	  if (*b != '-')
409
	    return -1;
410
	  a++; b++;
481 by Brian Aker
Remove all of uchar.
411
	  swap_variables(unsigned char*, a, b);
1 by brian
clean slate
412
	  swap_variables(int, alength, blength);
413
	  swap_flag=1-swap_flag;
414
	  alength--; blength--;
415
	  end=a+alength;
416
	}
417
	else if (*b == '-')
418
	  return 1;
419
	while (alength && (*a == '+' || *a == '0'))
420
	{
421
	  a++; alength--;
422
	}
423
	while (blength && (*b == '+' || *b == '0'))
424
	{
425
	  b++; blength--;
426
	}
427
	if (alength != blength)
428
	  return (alength < blength) ? -1 : 1;
429
	while (a < end)
430
	  if (*a++ !=  *b++)
431
	    return ((int) a[-1] - (int) b[-1]);
432
      }
433
      else
434
      {
435
        b+=(end-a);
436
        a=end;
437
      }
438
439
      if (swap_flag)                            /* Restore pointers */
481 by Brian Aker
Remove all of uchar.
440
        swap_variables(unsigned char*, a, b);
1 by brian
clean slate
441
      break;
442
    }
443
    case HA_KEYTYPE_LONGLONG:
444
    {
152 by Brian Aker
longlong replacement
445
      int64_t ll_a,ll_b;
1 by brian
clean slate
446
      ll_a= mi_sint8korr(a);
447
      ll_b= mi_sint8korr(b);
448
      if (piks && (flag = CMP_NUM(ll_a,ll_b)))
449
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
450
      a=  end;
451
      b+= 8;
452
      break;
453
    }
454
    case HA_KEYTYPE_ULONGLONG:
455
    {
151 by Brian Aker
Ulonglong to uint64_t
456
      uint64_t ll_a,ll_b;
1 by brian
clean slate
457
      ll_a= mi_uint8korr(a);
458
      ll_b= mi_uint8korr(b);
459
      if (piks && (flag = CMP_NUM(ll_a,ll_b)))
460
        return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
461
      a=  end;
462
      b+= 8;
463
      break;
464
    }
465
    case HA_KEYTYPE_END:                        /* Ready */
466
      goto end;                                 /* diff_pos is incremented */
467
    }
468
  }
469
  (*diff_pos)++;
470
end:
471
  if (!(nextflag & SEARCH_FIND))
472
  {
482 by Brian Aker
Remove uint.
473
    uint32_t i;
1 by brian
clean slate
474
    if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST)) /* Find record after key */
475
      return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1;
476
    flag=0;
477
    for (i=keyseg->length ; i-- > 0 ; )
478
    {
479
      if (*a++ != *b++)
480
      {
481
        flag= FCMP(a[-1],b[-1]);
482
        break;
483
      }
484
    }
485
    if (nextflag & SEARCH_SAME)
486
      return (flag);                            /* read same */
487
    if (nextflag & SEARCH_BIGGER)
488
      return (flag <= 0 ? -1 : 1);              /* read next */
489
    return (flag < 0 ? -1 : 1);                 /* read previous */
490
  }
491
  return 0;
492
} /* ha_key_cmp */
493
494
495
/*
496
  Find the first NULL value in index-suffix values tuple
497
498
  SYNOPSIS
499
    ha_find_null()
500
      keyseg     Array of keyparts for key suffix
501
      a          Key suffix value tuple
502
503
  DESCRIPTION
504
    Find the first NULL value in index-suffix values tuple.
505
506
  TODO
507
    Consider optimizing this function or its use so we don't search for
508
    NULL values in completely NOT NULL index suffixes.
509
510
  RETURN
511
    First key part that has NULL as value in values tuple, or the last key
512
    part (with keyseg->type==HA_TYPE_END) if values tuple doesn't contain
513
    NULLs.
514
*/
515
481 by Brian Aker
Remove all of uchar.
516
HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, unsigned char *a)
1 by brian
clean slate
517
{
518
  for (; (enum ha_base_keytype) keyseg->type != HA_KEYTYPE_END; keyseg++)
519
  {
481 by Brian Aker
Remove all of uchar.
520
    unsigned char *end;
1 by brian
clean slate
521
    if (keyseg->null_bit)
522
    {
523
      if (!*a++)
524
        return keyseg;
525
    }
526
    end= a+ keyseg->length;
527
528
    switch ((enum ha_base_keytype) keyseg->type) {
529
    case HA_KEYTYPE_TEXT:
530
    case HA_KEYTYPE_BINARY:
531
    case HA_KEYTYPE_BIT:
532
      if (keyseg->flag & HA_SPACE_PACK)
533
      {
534
        int a_length;
535
        get_key_length(a_length, a);
536
        a += a_length;
537
        break;
538
      }
539
      else
540
        a= end;
541
      break;
542
    case HA_KEYTYPE_VARTEXT1:
543
    case HA_KEYTYPE_VARTEXT2:
544
    case HA_KEYTYPE_VARBINARY1:
545
    case HA_KEYTYPE_VARBINARY2:
546
      {
547
        int a_length;
548
        get_key_length(a_length, a);
549
        a+= a_length;
550
        break;
551
      }
552
    case HA_KEYTYPE_NUM:
553
      if (keyseg->flag & HA_SPACE_PACK)
554
      {
555
        int alength= *a++;
556
        end= a+alength;
557
      }
558
      a= end;
559
      break;
560
    case HA_KEYTYPE_INT8:
561
    case HA_KEYTYPE_SHORT_INT:
562
    case HA_KEYTYPE_USHORT_INT:
563
    case HA_KEYTYPE_LONG_INT:
564
    case HA_KEYTYPE_ULONG_INT:
565
    case HA_KEYTYPE_INT24:
566
    case HA_KEYTYPE_UINT24:
567
    case HA_KEYTYPE_LONGLONG:
568
    case HA_KEYTYPE_ULONGLONG:
569
    case HA_KEYTYPE_FLOAT:
570
    case HA_KEYTYPE_DOUBLE:
571
      a= end;
572
      break;
573
    case HA_KEYTYPE_END:                        /* purecov: inspected */
574
      /* keep compiler happy */
51.3.20 by Jay Pipes
Phase 6 - Remove DBUG from mysys
575
      assert(0);
1 by brian
clean slate
576
      break;
577
    }
578
  }
579
  return keyseg;
580
}
581
582
583