diff options
Diffstat (limited to 'storage/maria/maria_chk.c')
-rw-r--r-- | storage/maria/maria_chk.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index b64a7379c50..767b0c8218d 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -1677,6 +1677,17 @@ static int maria_sort_records(HA_CHECK *param, param->error_printed=0; DBUG_RETURN(0); /* Nothing to do */ } + if (keyinfo->flag & HA_BINARY_PACK_KEY) + { + _ma_check_print_warning(param, + "Can't sort table '%s' on a key with prefix " + "packing %d", + name,sort_key+1); + param->error_printed=0; + DBUG_RETURN(0); + } + + if (share->data_file_type == COMPRESSED_RECORD) { _ma_check_print_warning(param,"Can't sort read-only table '%s'", name); @@ -1822,17 +1833,21 @@ static int sort_record_index(MARIA_SORT_PARAM *sort_param,MARIA_HA *info, File new_file,my_bool update_index) { MARIA_SHARE *share= info->s; - uint nod_flag,used_length,key_length; + uint page_flag, nod_flag,used_length; uchar *temp_buff,*keypos,*endpos; my_off_t next_page,rec_pos; - uchar lastkey[HA_MAX_KEY_BUFF]; + uchar lastkey[MARIA_MAX_KEY_BUFF]; char llbuff[22]; MARIA_SORT_INFO *sort_info= sort_param->sort_info; HA_CHECK *param=sort_info->param; + MARIA_KEY tmp_key; DBUG_ENTER("sort_record_index"); - nod_flag=_ma_test_if_nod(share, buff); + page_flag= _ma_get_keypage_flag(share, buff); + nod_flag= _ma_test_if_nod(share, buff); temp_buff=0; + tmp_key.keyinfo= keyinfo; + tmp_key.data= lastkey; if (nod_flag) { @@ -1866,10 +1881,9 @@ static int sort_record_index(MARIA_SORT_PARAM *sort_param,MARIA_HA *info, } _sanity(__FILE__,__LINE__); if (keypos >= endpos || - (key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&keypos,lastkey)) - == 0) + !(*keyinfo->get_key)(&tmp_key, page_flag, nod_flag, &keypos)) break; - rec_pos= _ma_dpos(info,0,lastkey+key_length); + rec_pos= _ma_row_pos_from_key(&tmp_key); if ((*share->read_record)(info,sort_param->record,rec_pos)) { @@ -1878,10 +1892,10 @@ static int sort_record_index(MARIA_SORT_PARAM *sort_param,MARIA_HA *info, } if (rec_pos != sort_param->filepos && update_index) { - _ma_dpointer(info,keypos-nod_flag-share->rec_reflength, + _ma_dpointer(share, keypos - nod_flag - tmp_key.ref_length, sort_param->filepos); if (maria_movepoint(info,sort_param->record,rec_pos,sort_param->filepos, - sort_key)) + sort_key)) { _ma_check_print_error(param,"%d when updating key-pointers",my_errno); goto err; |