00102 {
00103 int flag;
00104 int16 s_1,s_2;
00105 int32 l_1,l_2;
00106 uint32 u_1,u_2;
00107 float f_1,f_2;
00108 double d_1,d_2;
00109 uint next_key_length;
00110
00111 *diff_pos=0;
00112 for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
00113 {
00114 uchar *end;
00115 uint piks=! (keyseg->flag & HA_NO_SORT);
00116 (*diff_pos)++;
00117
00118
00119 if (keyseg->null_bit)
00120 {
00121 key_length--;
00122 if (*a != *b && piks)
00123 {
00124 flag = (int) *a - (int) *b;
00125 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00126 }
00127 b++;
00128 if (!*a++)
00129 {
00130 if (nextflag == (SEARCH_FIND | SEARCH_UPDATE))
00131 nextflag=SEARCH_SAME;
00132 else if (nextflag & SEARCH_NULL_ARE_NOT_EQUAL)
00133 {
00134
00135
00136
00137
00138
00139 return -1;
00140 }
00141 next_key_length=key_length;
00142 continue;
00143 }
00144 }
00145 end= a+ min(keyseg->length,key_length);
00146 next_key_length=key_length-keyseg->length;
00147
00148 switch ((enum ha_base_keytype) keyseg->type) {
00149 case HA_KEYTYPE_TEXT:
00150 if (keyseg->flag & HA_SPACE_PACK)
00151 {
00152 int a_length,b_length,pack_length;
00153 get_key_length(a_length,a);
00154 get_key_pack_length(b_length,pack_length,b);
00155 next_key_length=key_length-b_length-pack_length;
00156
00157 if (piks &&
00158 (flag=mi_compare_text(keyseg->charset,a,a_length,b,b_length,
00159 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00160 next_key_length <= 0),
00161 (my_bool)!(nextflag & SEARCH_PREFIX))))
00162 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00163 a+=a_length;
00164 b+=b_length;
00165 break;
00166 }
00167 else
00168 {
00169 uint length=(uint) (end-a), a_length=length, b_length=length;
00170 if (piks &&
00171 (flag= mi_compare_text(keyseg->charset, a, a_length, b, b_length,
00172 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00173 next_key_length <= 0),
00174 (my_bool)!(nextflag & SEARCH_PREFIX))))
00175 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00176 a=end;
00177 b+=length;
00178 }
00179 break;
00180 case HA_KEYTYPE_BINARY:
00181 if (keyseg->flag & HA_SPACE_PACK)
00182 {
00183 int a_length,b_length,pack_length;
00184 get_key_length(a_length,a);
00185 get_key_pack_length(b_length,pack_length,b);
00186 next_key_length=key_length-b_length-pack_length;
00187
00188 if (piks &&
00189 (flag=compare_bin(a,a_length,b,b_length,
00190 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00191 next_key_length <= 0),1)))
00192 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00193 a+=a_length;
00194 b+=b_length;
00195 break;
00196 }
00197 else
00198 {
00199 uint length=keyseg->length;
00200 if (piks &&
00201 (flag=compare_bin(a,length,b,length,
00202 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00203 next_key_length <= 0),0)))
00204 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00205 a+=length;
00206 b+=length;
00207 }
00208 break;
00209 case HA_KEYTYPE_VARTEXT:
00210 {
00211 int a_length,full_a_length,b_length,full_b_length,pack_length;
00212 get_key_length(a_length,a);
00213 get_key_pack_length(b_length,pack_length,b);
00214 full_a_length= a_length;
00215 full_b_length= b_length;
00216 next_key_length=key_length-b_length-pack_length;
00217
00218 if (piks &&
00219 (flag= mi_compare_text(keyseg->charset,a,a_length,b,b_length,
00220 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00221 next_key_length <= 0),
00222 (my_bool) ((nextflag & (SEARCH_FIND |
00223 SEARCH_UPDATE)) ==
00224 SEARCH_FIND))))
00225 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00226 a+= full_a_length;
00227 b+= full_b_length;
00228 break;
00229 }
00230 break;
00231 case HA_KEYTYPE_VARBINARY:
00232 {
00233 int a_length,b_length,pack_length;
00234 get_key_length(a_length,a);
00235 get_key_pack_length(b_length,pack_length,b);
00236 next_key_length=key_length-b_length-pack_length;
00237
00238 if (piks &&
00239 (flag=compare_bin(a,a_length,b,b_length,
00240 (my_bool) ((nextflag & SEARCH_PREFIX) &&
00241 next_key_length <= 0), 0)))
00242 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00243 a+=a_length;
00244 b+=b_length;
00245 break;
00246 }
00247 break;
00248 case HA_KEYTYPE_INT8:
00249 {
00250 int i_1= (int) *((signed char*) a);
00251 int i_2= (int) *((signed char*) b);
00252 if (piks && (flag = CMP_NUM(i_1,i_2)))
00253 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00254 a= end;
00255 b++;
00256 break;
00257 }
00258 case HA_KEYTYPE_SHORT_INT:
00259 s_1= mi_sint2korr(a);
00260 s_2= mi_sint2korr(b);
00261 if (piks && (flag = CMP_NUM(s_1,s_2)))
00262 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00263 a= end;
00264 b+= 2;
00265 break;
00266 case HA_KEYTYPE_USHORT_INT:
00267 {
00268 uint16 us_1,us_2;
00269 us_1= mi_sint2korr(a);
00270 us_2= mi_sint2korr(b);
00271 if (piks && (flag = CMP_NUM(us_1,us_2)))
00272 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00273 a= end;
00274 b+=2;
00275 break;
00276 }
00277 case HA_KEYTYPE_LONG_INT:
00278 l_1= mi_sint4korr(a);
00279 l_2= mi_sint4korr(b);
00280 if (piks && (flag = CMP_NUM(l_1,l_2)))
00281 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00282 a= end;
00283 b+= 4;
00284 break;
00285 case HA_KEYTYPE_ULONG_INT:
00286 u_1= mi_sint4korr(a);
00287 u_2= mi_sint4korr(b);
00288 if (piks && (flag = CMP_NUM(u_1,u_2)))
00289 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00290 a= end;
00291 b+= 4;
00292 break;
00293 case HA_KEYTYPE_INT24:
00294 l_1=mi_sint3korr(a);
00295 l_2=mi_sint3korr(b);
00296 if (piks && (flag = CMP_NUM(l_1,l_2)))
00297 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00298 a= end;
00299 b+= 3;
00300 break;
00301 case HA_KEYTYPE_UINT24:
00302 l_1=mi_uint3korr(a);
00303 l_2=mi_uint3korr(b);
00304 if (piks && (flag = CMP_NUM(l_1,l_2)))
00305 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00306 a= end;
00307 b+= 3;
00308 break;
00309 case HA_KEYTYPE_FLOAT:
00310 mi_float4get(f_1,a);
00311 mi_float4get(f_2,b);
00312
00313
00314
00315
00316
00317 if (piks && (flag = CMP_NUM(f_1,f_2)))
00318 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00319 a= end;
00320 b+= 4;
00321 break;
00322 case HA_KEYTYPE_DOUBLE:
00323 mi_float8get(d_1,a);
00324 mi_float8get(d_2,b);
00325
00326
00327
00328
00329
00330 if (piks && (flag = CMP_NUM(d_1,d_2)))
00331 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00332 a= end;
00333 b+= 8;
00334 break;
00335 case HA_KEYTYPE_NUM:
00336 {
00337 int swap_flag= 0;
00338 int alength,blength;
00339
00340 if (keyseg->flag & HA_REVERSE_SORT)
00341 {
00342 swap_variables(uchar*, a, b);
00343 swap_flag=1;
00344 end= a+ (int) (end-b);
00345 }
00346 if (keyseg->flag & HA_SPACE_PACK)
00347 {
00348 alength= *a++; blength= *b++;
00349 end=a+alength;
00350 next_key_length=key_length-blength-1;
00351 }
00352 else
00353 {
00354 alength= (int) (end-a);
00355 blength=keyseg->length;
00356
00357 for ( ; alength && *a == ' ' ; a++, alength--) ;
00358 for ( ; blength && *b == ' ' ; b++, blength--) ;
00359 }
00360 if (piks)
00361 {
00362 if (*a == '-')
00363 {
00364 if (*b != '-')
00365 return -1;
00366 a++; b++;
00367 swap_variables(uchar*, a, b);
00368 swap_variables(int, alength, blength);
00369 swap_flag=1-swap_flag;
00370 alength--; blength--;
00371 end=a+alength;
00372 }
00373 else if (*b == '-')
00374 return 1;
00375 while (alength && (*a == '+' || *a == '0'))
00376 {
00377 a++; alength--;
00378 }
00379 while (blength && (*b == '+' || *b == '0'))
00380 {
00381 b++; blength--;
00382 }
00383 if (alength != blength)
00384 return (alength < blength) ? -1 : 1;
00385 while (a < end)
00386 if (*a++ != *b++)
00387 return ((int) a[-1] - (int) b[-1]);
00388 }
00389 else
00390 {
00391 b+=(end-a);
00392 a=end;
00393 }
00394
00395 if (swap_flag)
00396 swap_variables(uchar*, a, b);
00397 break;
00398 }
00399 #ifdef HAVE_LONG_LONG
00400 case HA_KEYTYPE_LONGLONG:
00401 {
00402 longlong ll_a,ll_b;
00403 ll_a= mi_sint8korr(a);
00404 ll_b= mi_sint8korr(b);
00405 if (piks && (flag = CMP_NUM(ll_a,ll_b)))
00406 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00407 a= end;
00408 b+= 8;
00409 break;
00410 }
00411 case HA_KEYTYPE_ULONGLONG:
00412 {
00413 ulonglong ll_a,ll_b;
00414 ll_a= mi_uint8korr(a);
00415 ll_b= mi_uint8korr(b);
00416 if (piks && (flag = CMP_NUM(ll_a,ll_b)))
00417 return ((keyseg->flag & HA_REVERSE_SORT) ? -flag : flag);
00418 a= end;
00419 b+= 8;
00420 break;
00421 }
00422 #endif
00423 case HA_KEYTYPE_END:
00424 goto end;
00425 }
00426 }
00427 (*diff_pos)++;
00428 end:
00429 if (!(nextflag & SEARCH_FIND))
00430 {
00431 uint i;
00432 if (nextflag & (SEARCH_NO_FIND | SEARCH_LAST))
00433 return (nextflag & (SEARCH_BIGGER | SEARCH_LAST)) ? -1 : 1;
00434 flag=0;
00435 for (i=keyseg->length ; i-- > 0 ; )
00436 {
00437 if (*a++ != *b++)
00438 {
00439 flag= FCMP(a[-1],b[-1]);
00440 break;
00441 }
00442 }
00443 if (nextflag & SEARCH_SAME)
00444 return (flag);
00445 if (nextflag & SEARCH_BIGGER)
00446 return (flag <= 0 ? -1 : 1);
00447 return (flag < 0 ? -1 : 1);
00448 }
00449 return 0;
00450 }