*** ../mysql-5.0.bk-orig/myisam/mi_delete.c Sat Feb 10 15:13:53 2007 --- myisam/mi_delete.c Fri Feb 16 15:01:24 2007 *************** *** 227,233 **** search_key_length= (comp_flag & SEARCH_FIND) ? key_length : USE_WHOLE_KEY; flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key, search_key_length, ! comp_flag, &keypos, lastkey, &last_key); if (flag == MI_FOUND_WRONG_KEY) { DBUG_PRINT("error",("Found wrong key")); --- 227,233 ---- search_key_length= (comp_flag & SEARCH_FIND) ? key_length : USE_WHOLE_KEY; flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key, search_key_length, ! comp_flag, &keypos, lastkey, &last_key, (uint *) 0); if (flag == MI_FOUND_WRONG_KEY) { DBUG_PRINT("error",("Found wrong key")); *************** *** 256,262 **** { /* we need exact match only if not in ft1->ft2 conversion mode */ flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key,USE_WHOLE_KEY, ! comp_flag, &keypos, lastkey, &last_key); } /* fall through to normal delete */ } --- 256,262 ---- { /* we need exact match only if not in ft1->ft2 conversion mode */ flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key,USE_WHOLE_KEY, ! comp_flag, &keypos, lastkey, &last_key, (uint *) 0); } /* fall through to normal delete */ } *** ../mysql-5.0.bk-orig/myisam/mi_range.c Sat Feb 10 15:13:55 2007 --- myisam/mi_range.c Fri Feb 16 16:28:33 2007 *************** *** 25,33 **** enum ha_rkey_function search_flag); static double _mi_search_pos(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, uint key_len,uint nextflag,my_off_t pos); ! static uint _mi_keynr(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, ! uchar *keypos,uint *ret_max_key); ! /* Estimate how many records there is in a given range --- 25,32 ---- enum ha_rkey_function search_flag); static double _mi_search_pos(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, uint key_len,uint nextflag,my_off_t pos); ! static uint _mi_keymax(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ! uchar *keypos, uint keynr); /* Estimate how many records there is in a given range *************** *** 178,186 **** if (!(buff=_mi_fetch_keypage(info,keyinfo,pos,DFLT_INIT_HITS,info->buff,1))) goto err; flag=(*keyinfo->bin_search)(info,keyinfo,buff,key,key_len,nextflag, ! &keypos,info->lastkey, &after_key); nod_flag=mi_test_if_nod(buff); ! keynr=_mi_keynr(info,keyinfo,buff,keypos,&max_keynr); if (flag) { --- 183,191 ---- if (!(buff=_mi_fetch_keypage(info,keyinfo,pos,DFLT_INIT_HITS,info->buff,1))) goto err; flag=(*keyinfo->bin_search)(info,keyinfo,buff,key,key_len,nextflag, ! &keypos,info->lastkey, &after_key, &keynr); nod_flag=mi_test_if_nod(buff); ! max_keynr= _mi_keymax(info,keyinfo,buff,keypos,keynr); if (flag) { *************** *** 217,224 **** DBUG_RETURN(offset); /* Read error */ } } ! DBUG_PRINT("info",("keynr: %d offset: %g max_keynr: %d nod: %d flag: %d", ! keynr,offset,max_keynr,nod_flag,flag)); DBUG_RETURN((keynr+offset)/(max_keynr+1)); err: DBUG_PRINT("exit",("Error: %d",my_errno)); --- 222,229 ---- DBUG_RETURN(offset); /* Read error */ } } ! DBUG_PRINT("info",("keynr: %d offset: %g max_keynr: %d nod: %d flag: %d nextflag: %d", ! keynr,offset,max_keynr,nod_flag,flag, nextflag)); DBUG_RETURN((keynr+offset)/(max_keynr+1)); err: DBUG_PRINT("exit",("Error: %d",my_errno)); *************** *** 228,237 **** /* Get keynummer of current key and max number of keys in nod */ ! static uint _mi_keynr(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ! uchar *keypos, uint *ret_max_key) { ! uint nod_flag,keynr,max_key; uchar t_buff[MI_MAX_KEY_BUFF],*end; end= page+mi_getint(page); --- 233,242 ---- /* Get keynummer of current key and max number of keys in nod */ ! static uint _mi_keymax(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ! uchar *keypos, uint keynr) { ! uint nod_flag, max_key; uchar t_buff[MI_MAX_KEY_BUFF],*end; end= page+mi_getint(page); *************** *** 240,259 **** if (!(keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) { ! *ret_max_key= (uint) (end-page)/(keyinfo->keylength+nod_flag); ! return (uint) (keypos-page)/(keyinfo->keylength+nod_flag); } ! max_key=keynr=0; ! t_buff[0]=0; /* Safety */ while (page < end) { ! if (!(*keyinfo->get_key)(keyinfo,nod_flag,&page,t_buff)) return 0; /* Error */ max_key++; - if (page == keypos) - keynr=max_key; } ! *ret_max_key=max_key; ! return(keynr); } --- 245,263 ---- if (!(keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) { ! return (uint) (end-page)/(keyinfo->keylength+nod_flag); } ! max_key=keynr; ! page = keypos; ! // t_buff[0]=0; /* Safety */ ! memcpy(&t_buff, info->lastkey, MI_MAX_KEY_BUFF); while (page < end) { ! if (!(*keyinfo->get_key)(keyinfo, nod_flag, &page, t_buff)) return 0; /* Error */ max_key++; } ! return(max_key); } + *** ../mysql-5.0.bk-orig/myisam/mi_search.c Sat Feb 10 15:14:03 2007 --- myisam/mi_search.c Fri Feb 16 16:35:58 2007 *************** *** 81,87 **** DBUG_DUMP("page",(byte*) buff,mi_getint(buff)); flag=(*keyinfo->bin_search)(info,keyinfo,buff,key,key_len,nextflag, ! &keypos,lastkey, &last_key); if (flag == MI_FOUND_WRONG_KEY) DBUG_RETURN(-1); nod_flag=mi_test_if_nod(buff); --- 81,87 ---- DBUG_DUMP("page",(byte*) buff,mi_getint(buff)); flag=(*keyinfo->bin_search)(info,keyinfo,buff,key,key_len,nextflag, ! &keypos,lastkey, &last_key, (uint*) 0); if (flag == MI_FOUND_WRONG_KEY) DBUG_RETURN(-1); nod_flag=mi_test_if_nod(buff); *************** *** 174,180 **** int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint comp_flag, uchar **ret_pos, ! uchar *buff __attribute__((unused)), my_bool *last_key) { reg4 int start,mid,end,save_end; int flag; --- 174,180 ---- int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint comp_flag, uchar **ret_pos, ! uchar *buff __attribute__((unused)), my_bool *last_key, uint *keynr) { reg4 int start,mid,end,save_end; int flag; *************** *** 205,210 **** --- 205,212 ---- start++; /* point at next, bigger key */ *ret_pos=page+(uint) start*totlength; *last_key= end == save_end; + if(!(keynr == (uint *) 0)) + *keynr = (uint) (*ret_pos-page)/totlength; DBUG_PRINT("exit",("flag: %d keypos: %d",flag,start)); DBUG_RETURN(flag); } /* _mi_bin_search */ *************** *** 238,246 **** int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint comp_flag, uchar **ret_pos, ! uchar *buff, my_bool *last_key) { ! int flag; uint nod_flag,length,not_used[2]; uchar t_buff[MI_MAX_KEY_BUFF],*end; DBUG_ENTER("_mi_seq_search"); --- 240,248 ---- int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint comp_flag, uchar **ret_pos, ! uchar *buff, my_bool *last_key, uint *keynr) { ! int flag, keynr1; uint nod_flag,length,not_used[2]; uchar t_buff[MI_MAX_KEY_BUFF],*end; DBUG_ENTER("_mi_seq_search"); *************** *** 251,256 **** --- 253,259 ---- page+=2+nod_flag; *ret_pos=page; t_buff[0]=0; /* Avoid bugs */ + keynr1= 0; while (page < end) { length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,t_buff); *************** *** 271,279 **** --- 274,286 ---- #endif memcpy(buff,t_buff,length); *ret_pos=page; + keynr1++; } if (flag == 0) memcpy(buff,t_buff,length); /* Result is first key */ + if(!(keynr == (uint *) 0)) + *keynr = keynr1; + *last_key= page == end; DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); *************** *** 282,295 **** int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint nextflag, uchar **ret_pos, ! uchar *buff, my_bool *last_key) { /* my_flag is raw comparison result to be changed according to SEARCH_NO_FIND,SEARCH_LAST and HA_REVERSE_SORT flags. flag is the value returned by ha_key_cmp and as treated as final */ ! int flag=0, my_flag=-1; uint nod_flag, length, len, matched, cmplen, kseg_len; uint prefix_len,suffix_len; int key_len_skip, seg_len_pack, key_len_left; --- 289,302 ---- int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint key_len, uint nextflag, uchar **ret_pos, ! uchar *buff, my_bool *last_key, uint *keynr) { /* my_flag is raw comparison result to be changed according to SEARCH_NO_FIND,SEARCH_LAST and HA_REVERSE_SORT flags. flag is the value returned by ha_key_cmp and as treated as final */ ! int flag=0, my_flag=-1, keynr1; uint nod_flag, length, len, matched, cmplen, kseg_len; uint prefix_len,suffix_len; int key_len_skip, seg_len_pack, key_len_left; *************** *** 337,342 **** --- 344,350 ---- matched=0; /* how many char's from prefix were alredy matched */ len=0; /* length of previous key unpacked */ + keynr1= 0; while (page < end) { *************** *** 535,540 **** --- 543,549 ---- saved_from=saved_vseg; saved_length=length; *ret_pos=page; + keynr1++; } if (my_flag) flag=(keyinfo->seg->flag & HA_REVERSE_SORT) ? -my_flag : my_flag; *************** *** 549,554 **** --- 558,565 ---- memcpy(saved_to,saved_from,saved_length); *last_key= page == end; + if(!(keynr == (uint *) 0)) + *keynr = keynr1; DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); *** ../mysql-5.0.bk-orig/myisam/mi_write.c Wed Jan 3 07:52:45 2007 --- myisam/mi_write.c Fri Feb 16 15:01:24 2007 *************** *** 348,354 **** goto err; flag=(*keyinfo->bin_search)(info,keyinfo,temp_buff,key,search_key_length, ! comp_flag, &keypos, keybuff, &was_last_key); nod_flag=mi_test_if_nod(temp_buff); if (flag == 0) { --- 348,354 ---- goto err; flag=(*keyinfo->bin_search)(info,keyinfo,temp_buff,key,search_key_length, ! comp_flag, &keypos, keybuff, &was_last_key, (uint *) 0); nod_flag=mi_test_if_nod(temp_buff); if (flag == 0) { *************** *** 373,379 **** /* normal word, one-level tree structure */ flag=(*keyinfo->bin_search)(info, keyinfo, temp_buff, key, USE_WHOLE_KEY, comp_flag, ! &keypos, keybuff, &was_last_key); } else { --- 373,379 ---- /* normal word, one-level tree structure */ flag=(*keyinfo->bin_search)(info, keyinfo, temp_buff, key, USE_WHOLE_KEY, comp_flag, ! &keypos, keybuff, &was_last_key, (uint *) 0); } else { *** ../mysql-5.0.bk-orig/myisam/myisamdef.h Wed Jan 3 07:52:45 2007 --- myisam/myisamdef.h Fri Feb 16 15:01:24 2007 *************** *** 548,560 **** uint nextflag,my_off_t pos); extern int _mi_bin_search(struct st_myisam_info *info,MI_KEYDEF *keyinfo, uchar *page,uchar *key,uint key_len,uint comp_flag, ! uchar * *ret_pos,uchar *buff, my_bool *was_last_key); extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, uchar *key,uint key_len,uint comp_flag, ! uchar **ret_pos,uchar *buff, my_bool *was_last_key); extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, uchar *key,uint key_len,uint comp_flag, ! uchar **ret_pos,uchar *buff, my_bool *was_last_key); extern my_off_t _mi_kpos(uint nod_flag,uchar *after_key); extern void _mi_kpointer(MI_INFO *info,uchar *buff,my_off_t pos); extern my_off_t _mi_dpos(MI_INFO *info, uint nod_flag,uchar *after_key); --- 548,563 ---- uint nextflag,my_off_t pos); extern int _mi_bin_search(struct st_myisam_info *info,MI_KEYDEF *keyinfo, uchar *page,uchar *key,uint key_len,uint comp_flag, ! uchar * *ret_pos,uchar *buff, my_bool *was_last_key, ! uint *keynr); extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, uchar *key,uint key_len,uint comp_flag, ! uchar **ret_pos,uchar *buff, my_bool *was_last_key, ! uint *keynr); extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page, uchar *key,uint key_len,uint comp_flag, ! uchar **ret_pos,uchar *buff, my_bool *was_last_key, ! uint *keynr); extern my_off_t _mi_kpos(uint nod_flag,uchar *after_key); extern void _mi_kpointer(MI_INFO *info,uchar *buff,my_off_t pos); extern my_off_t _mi_dpos(MI_INFO *info, uint nod_flag,uchar *after_key); *** ../mysql-5.0.bk-orig/include/myisam.h Sat Feb 10 15:13:54 2007 --- include/myisam.h Fri Feb 16 15:01:24 2007 *************** *** 201,207 **** int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo, uchar *page,uchar *key, uint key_len,uint comp_flag,uchar * *ret_pos, ! uchar *buff, my_bool *was_last_key); uint (*get_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar * *page, uchar *key); int (*pack_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar *next_key, --- 201,207 ---- int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo, uchar *page,uchar *key, uint key_len,uint comp_flag,uchar * *ret_pos, ! uchar *buff, my_bool *was_last_key, uint *keynr); uint (*get_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar * *page, uchar *key); int (*pack_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar *next_key,