4 typedef struct st_dynamic_array
7 - uint elements,max_element;
8 - uint alloc_increment;
9 + ulong elements, max_element;
10 + ulong alloc_increment;
15 #define my_init_dynamic_array2(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E)
16 #define my_init_dynamic_array2_ci(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E)
17 extern my_bool init_dynamic_array2(DYNAMIC_ARRAY *array, uint element_size,
18 - void *init_buffer, uint init_alloc,
19 - uint alloc_increment);
20 + void *init_buffer, ulong init_alloc,
21 + ulong alloc_increment);
22 /* init_dynamic_array() function is deprecated */
23 extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size,
24 - uint init_alloc, uint alloc_increment);
25 + ulong init_alloc, ulong alloc_increment);
26 extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,uchar * element);
27 extern uchar *alloc_dynamic(DYNAMIC_ARRAY *array);
28 extern uchar *pop_dynamic(DYNAMIC_ARRAY*);
29 -extern my_bool set_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index);
30 -extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
31 -extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index);
32 +extern my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar * element, ulong array_index);
33 +extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, ulong max_elements);
34 +extern void get_dynamic(DYNAMIC_ARRAY *array, uchar * element, ulong array_index);
35 extern void delete_dynamic(DYNAMIC_ARRAY *array);
36 -extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
37 +extern void delete_dynamic_element(DYNAMIC_ARRAY *array, ulong array_index);
38 extern void freeze_size(DYNAMIC_ARRAY *array);
39 -extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element);
40 +extern long get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element);
41 #define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
42 #define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
43 #define push_dynamic(A,B) insert_dynamic((A),(B))
49 my_bool init_dynamic_array2(DYNAMIC_ARRAY *array, uint element_size,
50 - void *init_buffer, uint init_alloc,
51 - uint alloc_increment)
52 + void *init_buffer, ulong init_alloc,
53 + ulong alloc_increment)
55 DBUG_ENTER("init_dynamic_array");
60 my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size,
61 - uint init_alloc, uint alloc_increment)
62 + ulong init_alloc, ulong alloc_increment)
64 /* placeholder to preserve ABI */
65 return my_init_dynamic_array_ci(array, element_size, init_alloc,
70 -my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar* element, uint idx)
71 +my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar* element, ulong idx)
73 if (idx >= array->elements)
76 TRUE Allocation of new memory failed
79 -my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements)
80 +my_bool allocate_dynamic(DYNAMIC_ARRAY *array, ulong max_elements)
82 if (max_elements >= array->max_element)
87 size= (max_elements + array->alloc_increment)/array->alloc_increment;
88 size*= array->alloc_increment;
90 idx Index of element wanted.
93 -void get_dynamic(DYNAMIC_ARRAY *array, uchar* element, uint idx)
94 +void get_dynamic(DYNAMIC_ARRAY *array, uchar* element, ulong idx)
96 if (idx >= array->elements)
98 - DBUG_PRINT("warning",("To big array idx: %d, array size is %d",
99 + DBUG_PRINT("warning",("To big array idx: %lu, array size is %lu",
100 idx,array->elements));
101 bzero(element,array->size_of_element);
104 idx Index of element to be deleted
107 -void delete_dynamic_element(DYNAMIC_ARRAY *array, uint idx)
108 +void delete_dynamic_element(DYNAMIC_ARRAY *array, ulong idx)
110 char *ptr= (char*) array->buffer+array->size_of_element*idx;
114 void freeze_size(DYNAMIC_ARRAY *array)
116 - uint elements=max(array->elements,1);
117 + ulong elements= max(array->elements, 1);
120 Do nothing if we are using a static buffer
125 -int get_index_dynamic(DYNAMIC_ARRAY *array, uchar* element)
126 +long get_index_dynamic(DYNAMIC_ARRAY *array, uchar* element)
129 if (array->buffer > element)
130 --- a/storage/myisam/mi_check.c
131 +++ b/storage/myisam/mi_check.c
132 @@ -2429,7 +2429,7 @@
134 if (_create_index_by_sort(&sort_param,
135 (my_bool) (!(param->testflag & T_VERBOSE)),
136 - (uint) param->sort_buffer_length))
137 + param->sort_buffer_length))
139 param->retry_repair=1;
141 --- a/storage/myisam/sort.c
142 +++ b/storage/myisam/sort.c
145 /* Functions defined in this file */
147 -static ha_rows find_all_keys(MI_SORT_PARAM *info,uint keys,
148 +static ha_rows find_all_keys(MI_SORT_PARAM *info, ulong keys,
150 - DYNAMIC_ARRAY *buffpek,int *maxbuffer,
151 + DYNAMIC_ARRAY *buffpek, long *maxbuffer,
153 IO_CACHE *tempfile_for_exceptions);
154 static int write_keys(MI_SORT_PARAM *info,uchar **sort_keys,
155 - uint count, BUFFPEK *buffpek,IO_CACHE *tempfile);
156 + ulong count, BUFFPEK *buffpek,IO_CACHE *tempfile);
157 static int write_key(MI_SORT_PARAM *info, uchar *key,
159 static int write_index(MI_SORT_PARAM *info,uchar * *sort_keys,
161 -static int merge_many_buff(MI_SORT_PARAM *info,uint keys,
163 +static int merge_many_buff(MI_SORT_PARAM *info, ulong keys,
165 - BUFFPEK *buffpek,int *maxbuffer,
166 + BUFFPEK *buffpek, long *maxbuffer,
168 -static uint read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek,
169 +static ulong read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek,
171 -static int merge_buffers(MI_SORT_PARAM *info,uint keys,
172 +static int merge_buffers(MI_SORT_PARAM *info, ulong keys,
173 IO_CACHE *from_file, IO_CACHE *to_file,
174 uchar * *sort_keys, BUFFPEK *lastbuff,
175 BUFFPEK *Fb, BUFFPEK *Tb);
176 -static int merge_index(MI_SORT_PARAM *,uint,uchar **,BUFFPEK *, int,
177 +static int merge_index(MI_SORT_PARAM *, ulong, uchar **, BUFFPEK *, long,
179 static int flush_ft_buf(MI_SORT_PARAM *info);
181 static int write_keys_varlen(MI_SORT_PARAM *info,uchar **sort_keys,
182 - uint count, BUFFPEK *buffpek,
183 + ulong count, BUFFPEK *buffpek,
185 -static uint read_to_buffer_varlen(IO_CACHE *fromfile,BUFFPEK *buffpek,
187 +static ulong read_to_buffer_varlen(IO_CACHE *fromfile,BUFFPEK *buffpek,
189 static int write_merge_key(MI_SORT_PARAM *info, IO_CACHE *to_file,
190 - uchar *key, uint sort_length, uint count);
191 + uchar *key, uint sort_length, ulong count);
192 static int write_merge_key_varlen(MI_SORT_PARAM *info,
194 uchar* key, uint sort_length,
198 my_var_write(MI_SORT_PARAM *info, IO_CACHE *to_file, uchar *bufs);
201 int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
204 - int error,maxbuffer,skr;
205 - uint memavl,old_memavl,keys,sort_length;
207 + long maxbuffer, skr;
208 + ulong memavl, old_memavl, keys, sort_length;
209 DYNAMIC_ARRAY buffpek;
212 @@ -136,25 +137,25 @@
214 while (memavl >= MIN_SORT_BUFFER)
216 - if ((records < UINT_MAX32) &&
217 + if ((records < ULONG_MAX) &&
218 ((my_off_t) (records + 1) *
219 (sort_length + sizeof(char*)) <= (my_off_t) memavl))
220 - keys= (uint)records+1;
221 + keys= (ulong) records + 1;
226 - if (memavl < sizeof(BUFFPEK)*(uint) maxbuffer ||
227 - (keys=(memavl-sizeof(BUFFPEK)*(uint) maxbuffer)/
228 + if (memavl < sizeof(BUFFPEK) * (ulong) maxbuffer ||
229 + (keys = (memavl - sizeof(BUFFPEK) * (ulong) maxbuffer) /
230 (sort_length+sizeof(char*))) <= 1 ||
231 - keys < (uint) maxbuffer)
232 + keys < (ulong) maxbuffer)
234 mi_check_print_error(info->sort_info->param,
235 "myisam_sort_buffer_size is too small");
239 - while ((maxbuffer= (int) (records/(keys-1)+1)) != skr);
240 + while ((maxbuffer= (long) (records / (keys - 1) + 1)) != skr);
242 if ((sort_keys=(uchar **)my_malloc(keys*(sort_length+sizeof(char*))+
243 HA_FT_MAXBYTELEN, MYF(0))))
245 (*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */
248 - printf(" - Searching for keys, allocating buffer for %d keys\n",keys);
249 + printf(" - Searching for keys, allocating buffer for %lu keys\n", keys);
251 if ((records=find_all_keys(info,keys,sort_keys,&buffpek,&maxbuffer,
252 &tempfile,&tempfile_for_exceptions))
256 printf(" - Dumping %lu keys\n", (ulong) records);
257 - if (write_index(info,sort_keys, (uint) records))
258 + if (write_index(info,sort_keys, (ulong) records))
259 goto err; /* purecov: inspected */
262 @@ -253,13 +254,13 @@
264 /* Search after all keys and place them in a temp. file */
266 -static ha_rows find_all_keys(MI_SORT_PARAM *info, uint keys,
267 +static ha_rows find_all_keys(MI_SORT_PARAM *info, ulong keys,
268 uchar **sort_keys, DYNAMIC_ARRAY *buffpek,
269 - int *maxbuffer, IO_CACHE *tempfile,
270 + long *maxbuffer, IO_CACHE *tempfile,
271 IO_CACHE *tempfile_for_exceptions)
276 DBUG_ENTER("find_all_keys");
281 MI_SORT_PARAM *sort_param= (MI_SORT_PARAM*) arg;
283 - uint memavl,old_memavl,keys,sort_length;
284 - uint idx, maxbuffer;
285 + ulong memavl,old_memavl,keys,sort_length;
286 + ulong idx, maxbuffer;
291 sort_keys= (uchar **) NULL;
293 memavl= max(sort_param->sortbuff_size, MIN_SORT_BUFFER);
294 - idx= (uint)sort_param->sort_info->max_records;
295 + idx= (ulong) sort_param->sort_info->max_records;
296 sort_length= sort_param->key_length;
299 @@ -356,21 +357,21 @@
308 if (memavl < sizeof(BUFFPEK)*maxbuffer ||
309 (keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/
310 (sort_length+sizeof(char*))) <= 1 ||
311 - keys < (uint) maxbuffer)
314 mi_check_print_error(sort_param->sort_info->param,
315 "myisam_sort_buffer_size is too small");
319 - while ((maxbuffer= (int) (idx/(keys-1)+1)) != skr);
320 + while ((maxbuffer= (idx/(keys-1)+1)) != skr);
322 if ((sort_keys= (uchar**)
323 my_malloc(keys*(sort_length+sizeof(char*))+
327 if (sort_param->sort_info->param->testflag & T_VERBOSE)
328 - printf("Key %d - Allocating buffer for %d keys\n",
329 + printf("Key %d - Allocating buffer for %lu keys\n",
330 sort_param->key + 1, keys);
331 sort_param->sort_keys= sort_keys;
335 if (sinfo->buffpek.elements)
337 - uint maxbuffer=sinfo->buffpek.elements-1;
338 + ulong maxbuffer=sinfo->buffpek.elements-1;
341 length=param->sort_buffer_length;
343 printf("Key %d - Merging %u keys\n",sinfo->key+1, sinfo->keys);
344 if (merge_many_buff(sinfo, keys, (uchar **)mergebuf,
345 dynamic_element(&sinfo->buffpek, 0, BUFFPEK *),
346 - (int*) &maxbuffer, &sinfo->tempfile))
347 + (long *) &maxbuffer, &sinfo->tempfile))
352 /* Write all keys in memory to file for later merge */
354 static int write_keys(MI_SORT_PARAM *info, register uchar **sort_keys,
355 - uint count, BUFFPEK *buffpek, IO_CACHE *tempfile)
356 + ulong count, BUFFPEK *buffpek, IO_CACHE *tempfile)
359 uint sort_length=info->key_length;
362 static int write_keys_varlen(MI_SORT_PARAM *info,
363 register uchar **sort_keys,
364 - uint count, BUFFPEK *buffpek,
365 + ulong count, BUFFPEK *buffpek,
372 static int write_index(MI_SORT_PARAM *info, register uchar **sort_keys,
373 - register uint count)
374 + register ulong count)
376 DBUG_ENTER("write_index");
378 @@ -744,11 +745,11 @@
380 /* Merge buffers to make < MERGEBUFF2 buffers */
382 -static int merge_many_buff(MI_SORT_PARAM *info, uint keys,
383 +static int merge_many_buff(MI_SORT_PARAM *info, ulong keys,
384 uchar **sort_keys, BUFFPEK *buffpek,
385 - int *maxbuffer, IO_CACHE *t_file)
386 + long *maxbuffer, IO_CACHE *t_file)
390 IO_CACHE t_file2, *from_file, *to_file, *temp;
392 DBUG_ENTER("merge_many_buff");
394 if (flush_io_cache(to_file))
395 break; /* purecov: inspected */
396 temp=from_file; from_file=to_file; to_file=temp;
397 - *maxbuffer= (int) (lastbuff-buffpek)-1;
398 + *maxbuffer= (long) (lastbuff-buffpek)-1;
401 close_cached_file(to_file); /* This holds old result */
402 @@ -807,18 +808,18 @@
406 -static uint read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek,
408 +static ulong read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek,
411 - register uint count;
413 + register ulong count;
416 - if ((count=(uint) min((ha_rows) buffpek->max_keys,buffpek->count)))
417 + if ((count=(ulong) min((ha_rows) buffpek->max_keys,buffpek->count)))
419 if (mysql_file_pread(fromfile->file, (uchar*) buffpek->base,
420 (length= sort_length*count),
421 buffpek->file_pos, MYF_RW))
422 - return((uint) -1); /* purecov: inspected */
423 + return((ulong) -1); /* purecov: inspected */
424 buffpek->key=buffpek->base;
425 buffpek->file_pos+= length; /* New filepos */
426 buffpek->count-= count;
427 @@ -827,15 +828,15 @@
428 return (count*sort_length);
429 } /* read_to_buffer */
431 -static uint read_to_buffer_varlen(IO_CACHE *fromfile, BUFFPEK *buffpek,
432 +static ulong read_to_buffer_varlen(IO_CACHE *fromfile, BUFFPEK *buffpek,
435 - register uint count;
436 + register ulong count;
437 uint16 length_of_key = 0;
442 - if ((count=(uint) min((ha_rows) buffpek->max_keys,buffpek->count)))
443 + if ((count=(ulong) min((ha_rows) buffpek->max_keys,buffpek->count)))
445 buffp = buffpek->base;
447 @@ -843,11 +844,11 @@
449 if (mysql_file_pread(fromfile->file, (uchar*)&length_of_key,
450 sizeof(length_of_key), buffpek->file_pos, MYF_RW))
452 + return((ulong) -1);
453 buffpek->file_pos+=sizeof(length_of_key);
454 if (mysql_file_pread(fromfile->file, (uchar*) buffp,
455 length_of_key, buffpek->file_pos, MYF_RW))
457 + return((ulong) -1);
458 buffpek->file_pos+=length_of_key;
459 buffp = buffp + sort_length;
463 static int write_merge_key_varlen(MI_SORT_PARAM *info,
464 IO_CACHE *to_file, uchar* key,
465 - uint sort_length, uint count)
466 + uint sort_length, ulong count)
472 for (idx=1;idx<=count;idx++)
475 static int write_merge_key(MI_SORT_PARAM *info __attribute__((unused)),
476 IO_CACHE *to_file, uchar *key,
477 - uint sort_length, uint count)
478 + uint sort_length, ulong count)
480 return my_b_write(to_file, key, (size_t) sort_length*count);
482 @@ -890,12 +891,13 @@
486 -merge_buffers(MI_SORT_PARAM *info, uint keys, IO_CACHE *from_file,
487 +merge_buffers(MI_SORT_PARAM *info, ulong keys, IO_CACHE *from_file,
488 IO_CACHE *to_file, uchar **sort_keys, BUFFPEK *lastbuff,
489 BUFFPEK *Fb, BUFFPEK *Tb)
492 - uint sort_length,maxcount;
497 my_off_t UNINIT_VAR(to_start_filepos);
500 DBUG_ENTER("merge_buffers");
503 - maxcount=keys/((uint) (Tb-Fb) +1);
504 + maxcount= keys / ((ulong) (Tb-Fb) + 1);
505 DBUG_ASSERT(maxcount > 0);
506 LINT_INIT(to_start_filepos);
509 strpos=(uchar*) sort_keys;
510 sort_length=info->key_length;
512 - if (init_queue(&queue,(uint) (Tb-Fb)+1,offsetof(BUFFPEK,key),0,
513 + if (init_queue(&queue, (uint) (Tb-Fb)+1, offsetof(BUFFPEK,key), 0,
514 (int (*)(void*, uchar *,uchar*)) info->key_cmp,
516 DBUG_RETURN(1); /* purecov: inspected */
518 count+= buffpek->count;
519 buffpek->base= strpos;
520 buffpek->max_keys=maxcount;
521 - strpos+= (uint) (error=(int) info->read_to_buffer(from_file,buffpek,
524 + strpos+= (error= info->read_to_buffer(from_file,buffpek, sort_length));
525 + if (error == (ulong) -1)
526 goto err; /* purecov: inspected */
527 queue_insert(&queue,(uchar*) buffpek);
529 @@ -957,10 +958,10 @@
530 buffpek->key+=sort_length;
531 if (! --buffpek->mem_count)
533 - if (!(error=(int) info->read_to_buffer(from_file,buffpek,sort_length)))
534 + if (!(error= info->read_to_buffer(from_file,buffpek,sort_length)))
536 uchar *base=buffpek->base;
537 - uint max_keys=buffpek->max_keys;
538 + ulong max_keys=buffpek->max_keys;
540 (void) queue_remove(&queue,0);
543 break; /* One buffer have been removed */
546 - else if (error == -1)
547 + else if (error == (ulong) -1)
548 goto err; /* purecov: inspected */
549 queue_replaced(&queue); /* Top element has been replaced */
551 @@ -1018,23 +1019,23 @@
555 - while ((error=(int) info->read_to_buffer(from_file,buffpek,sort_length)) != -1 &&
557 + while ((error= info->read_to_buffer(from_file,buffpek,sort_length))
558 + != (ulong) -1 && error != 0);
560 lastbuff->count=count;
562 lastbuff->file_pos=to_start_filepos;
564 delete_queue(&queue);
565 - DBUG_RETURN(error);
566 + DBUG_RETURN(error != 0);
567 } /* merge_buffers */
570 /* Do a merge to output-file (save only positions) */
573 -merge_index(MI_SORT_PARAM *info, uint keys, uchar **sort_keys,
574 - BUFFPEK *buffpek, int maxbuffer, IO_CACHE *tempfile)
575 +merge_index(MI_SORT_PARAM *info, ulong keys, uchar **sort_keys,
576 + BUFFPEK *buffpek, long maxbuffer, IO_CACHE *tempfile)
578 DBUG_ENTER("merge_index");
579 if (merge_buffers(info,keys,tempfile,(IO_CACHE*) 0,sort_keys,buffpek,buffpek,
581 +++ b/mysql-test/r/percona_bug45702.result
583 +CREATE TABLE t1 (a BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;
584 +INSERT INTO t1 VALUES (), (), (), (), (), (), (), ();
585 +INSERT INTO t1 SELECT NULL FROM t1;
586 +INSERT INTO t1 SELECT NULL FROM t1;
587 +INSERT INTO t1 SELECT NULL FROM t1;
588 +INSERT INTO t1 SELECT NULL FROM t1;
589 +INSERT INTO t1 SELECT NULL FROM t1;
590 +INSERT INTO t1 SELECT NULL FROM t1;
591 +INSERT INTO t1 SELECT NULL FROM t1;
592 +INSERT INTO t1 SELECT NULL FROM t1;
593 +INSERT INTO t1 SELECT NULL FROM t1;
594 +SET @old_myisam_sort_buffer_size = @@myisam_sort_buffer_size;
595 +SET @@myisam_sort_buffer_size = 4 * 1024 * 1024 * 1024;
597 +Table Op Msg_type Msg_text
598 +test.t1 repair status OK
599 +- recovering (with sort) MyISAM-table 'MYSQLD_DATADIR/test/t1'
602 +SET @@myisam_sort_buffer_size = @old_myisam_sort_buffer_size;
605 +++ b/mysql-test/t/percona_bug45702.test
607 +###############################################################################
608 +# Bug #45702: Impossible to specify myisam_sort_buffer > 4GB on 64 bit machines
609 +###############################################################################
611 +--source include/have_64bit.inc
613 +# Check that having data larger than MIN_SORT_BUFFER bytes can be handled by
614 +# _create_index_by_sort() with myisam_sort_buffer_size = 4 GB without errors.
615 +# The full test with large data volumes can not be a part of the test suite.
617 +CREATE TABLE t1 (a BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;
618 +INSERT INTO t1 VALUES (), (), (), (), (), (), (), ();
619 +INSERT INTO t1 SELECT NULL FROM t1;
620 +INSERT INTO t1 SELECT NULL FROM t1;
621 +INSERT INTO t1 SELECT NULL FROM t1;
622 +INSERT INTO t1 SELECT NULL FROM t1;
623 +INSERT INTO t1 SELECT NULL FROM t1;
624 +INSERT INTO t1 SELECT NULL FROM t1;
625 +INSERT INTO t1 SELECT NULL FROM t1;
626 +INSERT INTO t1 SELECT NULL FROM t1;
627 +INSERT INTO t1 SELECT NULL FROM t1;
629 +SET @old_myisam_sort_buffer_size = @@myisam_sort_buffer_size;
630 +SET @@myisam_sort_buffer_size = 4 * 1024 * 1024 * 1024;
634 +--let $MYSQLD_DATADIR= `select @@datadir`
635 +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
636 +--exec $MYISAMCHK -r --sort_buffer_size=4G $MYSQLD_DATADIR/test/t1
638 +SET @@myisam_sort_buffer_size = @old_myisam_sort_buffer_size;
641 --- a/sql/opt_range.cc
642 +++ b/sql/opt_range.cc
643 @@ -11728,7 +11728,7 @@
645 if (min_max_ranges.elements > 0)
647 - fprintf(DBUG_FILE, "%*susing %d quick_ranges for MIN/MAX:\n",
648 + fprintf(DBUG_FILE, "%*susing %lu quick_ranges for MIN/MAX:\n",
649 indent, "", min_max_ranges.elements);
652 --- a/mysys/my_pread.c
653 +++ b/mysys/my_pread.c
658 + size_t total_readbytes= 0;
660 #if !defined (HAVE_PREAD) && !defined (_WIN32)
664 error= (readbytes != Count);
667 + total_readbytes+= readbytes;
671 + if (readbytes > 0 && readbytes < Count && errno == 0)
674 + pread() may return less bytes than requested even if enough bytes are
675 + available according to the Linux man page.
676 + This makes determining the end-of-file condition a bit harder.
677 + We just do another pread() call to see if more bytes can be read,
678 + since all my_pread() users expect it to always return all available
679 + bytes. For end-of-file 0 bytes is returned. This can never be the case
680 + for a partial read, since according to the man page, -1 is returned
681 + with errno set to EINTR if no data has been read.
683 + Buffer+= readbytes;
684 + offset+= readbytes;
690 my_errno= errno ? errno : -1;
691 if (errno == 0 || (readbytes != (size_t) -1 &&
692 (MyFlags & (MY_NABP | MY_FNABP))))
695 if (MyFlags & (MY_NABP | MY_FNABP))
696 DBUG_RETURN(0); /* Read went ok; Return 0 */
697 - DBUG_RETURN(readbytes); /* purecov: inspected */
698 + DBUG_RETURN(total_readbytes); /* purecov: inspected */
702 --- a/storage/myisam/myisamdef.h
703 +++ b/storage/myisam/myisamdef.h
704 @@ -340,10 +340,10 @@
705 int (*key_write)(struct st_mi_sort_param *, const void *);
706 void (*lock_in_memory)(MI_CHECK *);
707 int (*write_keys)(struct st_mi_sort_param *, register uchar **,
708 - uint , struct st_buffpek *, IO_CACHE *);
709 - uint (*read_to_buffer)(IO_CACHE *,struct st_buffpek *, uint);
710 + ulong , struct st_buffpek *, IO_CACHE *);
711 + ulong (*read_to_buffer)(IO_CACHE *,struct st_buffpek *, uint);
712 int (*write_key)(struct st_mi_sort_param *, IO_CACHE *,uchar *,
717 /* Some defines used by isam-funktions */
721 (1 + mi->ignore_server_ids.elements), MYF(MY_WME));
722 if (!ignore_server_ids_buf)
724 - ulong cur_len= sprintf(ignore_server_ids_buf, "%u",
725 + ulong cur_len= sprintf(ignore_server_ids_buf, "%lu",
726 mi->ignore_server_ids.elements);
727 for (ulong i= 0; i < mi->ignore_server_ids.elements; i++)