Merge lp:~akopytov/percona-server/bug878404-5.1 into lp:percona-server/5.1
- bug878404-5.1
- Merge into 5.1
Proposed by
Alexey Kopytov
Status: | Merged |
---|---|
Approved by: | Stewart Smith |
Approved revision: | no longer in the source branch. |
Merged at revision: | 329 |
Proposed branch: | lp:~akopytov/percona-server/bug878404-5.1 |
Merge into: | lp:percona-server/5.1 |
Diff against target: |
738 lines (+726/-0) 2 files modified
patches/bug45702.patch (+725/-0) patches/series (+1/-0) |
To merge this branch: | bzr merge lp:~akopytov/percona-server/bug878404-5.1 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Laurynas Biveinis (community) | Approve | ||
Review via email: mp+80495@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Alexey Kopytov (akopytov) wrote : | # |
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote : | # |
LGTM
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'patches/bug45702.patch' | |||
2 | --- patches/bug45702.patch 1970-01-01 00:00:00 +0000 | |||
3 | +++ patches/bug45702.patch 2011-10-26 19:30:29 +0000 | |||
4 | @@ -0,0 +1,725 @@ | |||
5 | 1 | --- a/include/my_sys.h | ||
6 | 2 | +++ b/include/my_sys.h | ||
7 | 3 | @@ -346,8 +346,8 @@ | ||
8 | 4 | typedef struct st_dynamic_array | ||
9 | 5 | { | ||
10 | 6 | uchar *buffer; | ||
11 | 7 | - uint elements,max_element; | ||
12 | 8 | - uint alloc_increment; | ||
13 | 9 | + ulong elements, max_element; | ||
14 | 10 | + ulong alloc_increment; | ||
15 | 11 | uint size_of_element; | ||
16 | 12 | } DYNAMIC_ARRAY; | ||
17 | 13 | |||
18 | 14 | @@ -809,23 +809,23 @@ | ||
19 | 15 | #define my_init_dynamic_array2(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E CALLER_INFO) | ||
20 | 16 | #define my_init_dynamic_array2_ci(A,B,C,D,E) init_dynamic_array2(A,B,C,D,E ORIG_CALLER_INFO) | ||
21 | 17 | extern my_bool init_dynamic_array2(DYNAMIC_ARRAY *array,uint element_size, | ||
22 | 18 | - void *init_buffer, uint init_alloc, | ||
23 | 19 | - uint alloc_increment | ||
24 | 20 | + void *init_buffer, ulong init_alloc, | ||
25 | 21 | + ulong alloc_increment | ||
26 | 22 | CALLER_INFO_PROTO); | ||
27 | 23 | /* init_dynamic_array() function is deprecated */ | ||
28 | 24 | extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size, | ||
29 | 25 | - uint init_alloc,uint alloc_increment | ||
30 | 26 | + ulong init_alloc, ulong alloc_increment | ||
31 | 27 | CALLER_INFO_PROTO); | ||
32 | 28 | extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,uchar * element); | ||
33 | 29 | extern uchar *alloc_dynamic(DYNAMIC_ARRAY *array); | ||
34 | 30 | extern uchar *pop_dynamic(DYNAMIC_ARRAY*); | ||
35 | 31 | -extern my_bool set_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); | ||
36 | 32 | -extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements); | ||
37 | 33 | -extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index); | ||
38 | 34 | +extern my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar * element, ulong array_index); | ||
39 | 35 | +extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, ulong max_elements); | ||
40 | 36 | +extern void get_dynamic(DYNAMIC_ARRAY *array, uchar * element, ulong array_index); | ||
41 | 37 | extern void delete_dynamic(DYNAMIC_ARRAY *array); | ||
42 | 38 | -extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index); | ||
43 | 39 | +extern void delete_dynamic_element(DYNAMIC_ARRAY *array, ulong array_index); | ||
44 | 40 | extern void freeze_size(DYNAMIC_ARRAY *array); | ||
45 | 41 | -extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element); | ||
46 | 42 | +extern long get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element); | ||
47 | 43 | #define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element) | ||
48 | 44 | #define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index)) | ||
49 | 45 | #define push_dynamic(A,B) insert_dynamic((A),(B)) | ||
50 | 46 | --- a/mysys/array.c | ||
51 | 47 | +++ b/mysys/array.c | ||
52 | 48 | @@ -44,8 +44,8 @@ | ||
53 | 49 | */ | ||
54 | 50 | |||
55 | 51 | my_bool init_dynamic_array2(DYNAMIC_ARRAY *array, uint element_size, | ||
56 | 52 | - void *init_buffer, uint init_alloc, | ||
57 | 53 | - uint alloc_increment CALLER_INFO_PROTO) | ||
58 | 54 | + void *init_buffer, ulong init_alloc, | ||
59 | 55 | + ulong alloc_increment CALLER_INFO_PROTO) | ||
60 | 56 | { | ||
61 | 57 | DBUG_ENTER("init_dynamic_array"); | ||
62 | 58 | if (!alloc_increment) | ||
63 | 59 | @@ -76,8 +76,8 @@ | ||
64 | 60 | } | ||
65 | 61 | |||
66 | 62 | my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size, | ||
67 | 63 | - uint init_alloc, | ||
68 | 64 | - uint alloc_increment CALLER_INFO_PROTO) | ||
69 | 65 | + ulong init_alloc, | ||
70 | 66 | + ulong alloc_increment CALLER_INFO_PROTO) | ||
71 | 67 | { | ||
72 | 68 | /* placeholder to preserve ABI */ | ||
73 | 69 | return my_init_dynamic_array_ci(array, element_size, init_alloc, | ||
74 | 70 | @@ -200,7 +200,7 @@ | ||
75 | 71 | FALSE Ok | ||
76 | 72 | */ | ||
77 | 73 | |||
78 | 74 | -my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar* element, uint idx) | ||
79 | 75 | +my_bool set_dynamic(DYNAMIC_ARRAY *array, uchar* element, ulong idx) | ||
80 | 76 | { | ||
81 | 77 | if (idx >= array->elements) | ||
82 | 78 | { | ||
83 | 79 | @@ -232,11 +232,11 @@ | ||
84 | 80 | TRUE Allocation of new memory failed | ||
85 | 81 | */ | ||
86 | 82 | |||
87 | 83 | -my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements) | ||
88 | 84 | +my_bool allocate_dynamic(DYNAMIC_ARRAY *array, ulong max_elements) | ||
89 | 85 | { | ||
90 | 86 | if (max_elements >= array->max_element) | ||
91 | 87 | { | ||
92 | 88 | - uint size; | ||
93 | 89 | + ulong size; | ||
94 | 90 | uchar *new_ptr; | ||
95 | 91 | size= (max_elements + array->alloc_increment)/array->alloc_increment; | ||
96 | 92 | size*= array->alloc_increment; | ||
97 | 93 | @@ -277,11 +277,11 @@ | ||
98 | 94 | idx Index of element wanted. | ||
99 | 95 | */ | ||
100 | 96 | |||
101 | 97 | -void get_dynamic(DYNAMIC_ARRAY *array, uchar* element, uint idx) | ||
102 | 98 | +void get_dynamic(DYNAMIC_ARRAY *array, uchar* element, ulong idx) | ||
103 | 99 | { | ||
104 | 100 | if (idx >= array->elements) | ||
105 | 101 | { | ||
106 | 102 | - DBUG_PRINT("warning",("To big array idx: %d, array size is %d", | ||
107 | 103 | + DBUG_PRINT("warning",("To big array idx: %lu, array size is %lu", | ||
108 | 104 | idx,array->elements)); | ||
109 | 105 | bzero(element,array->size_of_element); | ||
110 | 106 | return; | ||
111 | 107 | @@ -324,7 +324,7 @@ | ||
112 | 108 | idx Index of element to be deleted | ||
113 | 109 | */ | ||
114 | 110 | |||
115 | 111 | -void delete_dynamic_element(DYNAMIC_ARRAY *array, uint idx) | ||
116 | 112 | +void delete_dynamic_element(DYNAMIC_ARRAY *array, ulong idx) | ||
117 | 113 | { | ||
118 | 114 | char *ptr= (char*) array->buffer+array->size_of_element*idx; | ||
119 | 115 | array->elements--; | ||
120 | 116 | @@ -344,7 +344,7 @@ | ||
121 | 117 | |||
122 | 118 | void freeze_size(DYNAMIC_ARRAY *array) | ||
123 | 119 | { | ||
124 | 120 | - uint elements=max(array->elements,1); | ||
125 | 121 | + ulong elements= max(array->elements, 1); | ||
126 | 122 | |||
127 | 123 | /* | ||
128 | 124 | Do nothing if we are using a static buffer | ||
129 | 125 | @@ -372,7 +372,7 @@ | ||
130 | 126 | |||
131 | 127 | */ | ||
132 | 128 | |||
133 | 129 | -int get_index_dynamic(DYNAMIC_ARRAY *array, uchar* element) | ||
134 | 130 | +long get_index_dynamic(DYNAMIC_ARRAY *array, uchar* element) | ||
135 | 131 | { | ||
136 | 132 | size_t ret; | ||
137 | 133 | if (array->buffer > element) | ||
138 | 134 | --- a/storage/myisam/mi_check.c | ||
139 | 135 | +++ b/storage/myisam/mi_check.c | ||
140 | 136 | @@ -2435,7 +2435,7 @@ | ||
141 | 137 | |||
142 | 138 | if (_create_index_by_sort(&sort_param, | ||
143 | 139 | (my_bool) (!(param->testflag & T_VERBOSE)), | ||
144 | 140 | - (uint) param->sort_buffer_length)) | ||
145 | 141 | + param->sort_buffer_length)) | ||
146 | 142 | { | ||
147 | 143 | param->retry_repair=1; | ||
148 | 144 | goto err; | ||
149 | 145 | --- a/storage/myisam/myisamdef.h | ||
150 | 146 | +++ b/storage/myisam/myisamdef.h | ||
151 | 147 | @@ -347,10 +347,10 @@ | ||
152 | 148 | int (*key_write)(struct st_mi_sort_param *, const void *); | ||
153 | 149 | void (*lock_in_memory)(MI_CHECK *); | ||
154 | 150 | NEAR int (*write_keys)(struct st_mi_sort_param *, register uchar **, | ||
155 | 151 | - uint , struct st_buffpek *, IO_CACHE *); | ||
156 | 152 | - NEAR uint (*read_to_buffer)(IO_CACHE *,struct st_buffpek *, uint); | ||
157 | 153 | + ulong, struct st_buffpek *, IO_CACHE *); | ||
158 | 154 | + NEAR ulong (*read_to_buffer)(IO_CACHE *,struct st_buffpek *, uint); | ||
159 | 155 | NEAR int (*write_key)(struct st_mi_sort_param *, IO_CACHE *,uchar *, | ||
160 | 156 | - uint, uint); | ||
161 | 157 | + uint, ulong); | ||
162 | 158 | } MI_SORT_PARAM; | ||
163 | 159 | |||
164 | 160 | /* Some defines used by isam-funktions */ | ||
165 | 161 | --- a/storage/myisam/sort.c | ||
166 | 162 | +++ b/storage/myisam/sort.c | ||
167 | 163 | @@ -47,42 +47,42 @@ | ||
168 | 164 | |||
169 | 165 | /* Functions defined in this file */ | ||
170 | 166 | |||
171 | 167 | -static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info,uint keys, | ||
172 | 168 | +static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, ulong keys, | ||
173 | 169 | uchar **sort_keys, | ||
174 | 170 | - DYNAMIC_ARRAY *buffpek,int *maxbuffer, | ||
175 | 171 | + DYNAMIC_ARRAY *buffpek, long *maxbuffer, | ||
176 | 172 | IO_CACHE *tempfile, | ||
177 | 173 | IO_CACHE *tempfile_for_exceptions); | ||
178 | 174 | static int NEAR_F write_keys(MI_SORT_PARAM *info,uchar **sort_keys, | ||
179 | 175 | - uint count, BUFFPEK *buffpek,IO_CACHE *tempfile); | ||
180 | 176 | + ulong count, BUFFPEK *buffpek,IO_CACHE *tempfile); | ||
181 | 177 | static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, | ||
182 | 178 | IO_CACHE *tempfile); | ||
183 | 179 | static int NEAR_F write_index(MI_SORT_PARAM *info,uchar * *sort_keys, | ||
184 | 180 | - uint count); | ||
185 | 181 | -static int NEAR_F merge_many_buff(MI_SORT_PARAM *info,uint keys, | ||
186 | 182 | + ulong count); | ||
187 | 183 | +static int NEAR_F merge_many_buff(MI_SORT_PARAM *info, ulong keys, | ||
188 | 184 | uchar * *sort_keys, | ||
189 | 185 | - BUFFPEK *buffpek,int *maxbuffer, | ||
190 | 186 | + BUFFPEK *buffpek, long *maxbuffer, | ||
191 | 187 | IO_CACHE *t_file); | ||
192 | 188 | -static uint NEAR_F read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek, | ||
193 | 189 | - uint sort_length); | ||
194 | 190 | -static int NEAR_F merge_buffers(MI_SORT_PARAM *info,uint keys, | ||
195 | 191 | +static ulong NEAR_F read_to_buffer(IO_CACHE *fromfile,BUFFPEK *buffpek, | ||
196 | 192 | + uint sort_length); | ||
197 | 193 | +static int NEAR_F merge_buffers(MI_SORT_PARAM *info, ulong keys, | ||
198 | 194 | IO_CACHE *from_file, IO_CACHE *to_file, | ||
199 | 195 | uchar * *sort_keys, BUFFPEK *lastbuff, | ||
200 | 196 | BUFFPEK *Fb, BUFFPEK *Tb); | ||
201 | 197 | -static int NEAR_F merge_index(MI_SORT_PARAM *,uint,uchar **,BUFFPEK *, int, | ||
202 | 198 | +static int NEAR_F merge_index(MI_SORT_PARAM *, ulong, uchar **, BUFFPEK *, long, | ||
203 | 199 | IO_CACHE *); | ||
204 | 200 | static int flush_ft_buf(MI_SORT_PARAM *info); | ||
205 | 201 | |||
206 | 202 | static int NEAR_F write_keys_varlen(MI_SORT_PARAM *info,uchar **sort_keys, | ||
207 | 203 | - uint count, BUFFPEK *buffpek, | ||
208 | 204 | + ulong count, BUFFPEK *buffpek, | ||
209 | 205 | IO_CACHE *tempfile); | ||
210 | 206 | -static uint NEAR_F read_to_buffer_varlen(IO_CACHE *fromfile,BUFFPEK *buffpek, | ||
211 | 207 | +static ulong NEAR_F read_to_buffer_varlen(IO_CACHE *fromfile,BUFFPEK *buffpek, | ||
212 | 208 | uint sort_length); | ||
213 | 209 | static int NEAR_F write_merge_key(MI_SORT_PARAM *info, IO_CACHE *to_file, | ||
214 | 210 | - uchar *key, uint sort_length, uint count); | ||
215 | 211 | + uchar *key, uint sort_length, ulong count); | ||
216 | 212 | static int NEAR_F write_merge_key_varlen(MI_SORT_PARAM *info, | ||
217 | 213 | IO_CACHE *to_file, | ||
218 | 214 | uchar* key, uint sort_length, | ||
219 | 215 | - uint count); | ||
220 | 216 | + ulong count); | ||
221 | 217 | static inline int | ||
222 | 218 | my_var_write(MI_SORT_PARAM *info, IO_CACHE *to_file, uchar *bufs); | ||
223 | 219 | |||
224 | 220 | @@ -103,8 +103,9 @@ | ||
225 | 221 | int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, | ||
226 | 222 | ulong sortbuff_size) | ||
227 | 223 | { | ||
228 | 224 | - int error,maxbuffer,skr; | ||
229 | 225 | - uint memavl,old_memavl,keys,sort_length; | ||
230 | 226 | + int error; | ||
231 | 227 | + long maxbuffer, skr; | ||
232 | 228 | + ulong memavl, old_memavl, keys, sort_length; | ||
233 | 229 | DYNAMIC_ARRAY buffpek; | ||
234 | 230 | ha_rows records; | ||
235 | 231 | uchar **sort_keys; | ||
236 | 232 | @@ -138,25 +139,25 @@ | ||
237 | 233 | |||
238 | 234 | while (memavl >= MIN_SORT_BUFFER) | ||
239 | 235 | { | ||
240 | 236 | - if ((records < UINT_MAX32) && | ||
241 | 237 | + if ((records < ULONG_MAX) && | ||
242 | 238 | ((my_off_t) (records + 1) * | ||
243 | 239 | (sort_length + sizeof(char*)) <= (my_off_t) memavl)) | ||
244 | 240 | - keys= (uint)records+1; | ||
245 | 241 | + keys= (ulong) records + 1; | ||
246 | 242 | else | ||
247 | 243 | do | ||
248 | 244 | { | ||
249 | 245 | skr=maxbuffer; | ||
250 | 246 | - if (memavl < sizeof(BUFFPEK)*(uint) maxbuffer || | ||
251 | 247 | - (keys=(memavl-sizeof(BUFFPEK)*(uint) maxbuffer)/ | ||
252 | 248 | + if (memavl < sizeof(BUFFPEK) * (ulong) maxbuffer || | ||
253 | 249 | + (keys = (memavl - sizeof(BUFFPEK) * (ulong) maxbuffer) / | ||
254 | 250 | (sort_length+sizeof(char*))) <= 1 || | ||
255 | 251 | - keys < (uint) maxbuffer) | ||
256 | 252 | + keys < (ulong) maxbuffer) | ||
257 | 253 | { | ||
258 | 254 | mi_check_print_error(info->sort_info->param, | ||
259 | 255 | "myisam_sort_buffer_size is too small"); | ||
260 | 256 | goto err; | ||
261 | 257 | } | ||
262 | 258 | } | ||
263 | 259 | - while ((maxbuffer= (int) (records/(keys-1)+1)) != skr); | ||
264 | 260 | + while ((maxbuffer= (long) (records / (keys - 1) + 1)) != skr); | ||
265 | 261 | |||
266 | 262 | if ((sort_keys=(uchar **)my_malloc(keys*(sort_length+sizeof(char*))+ | ||
267 | 263 | HA_FT_MAXBYTELEN, MYF(0)))) | ||
268 | 264 | @@ -182,7 +183,7 @@ | ||
269 | 265 | (*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */ | ||
270 | 266 | |||
271 | 267 | if (!no_messages) | ||
272 | 268 | - printf(" - Searching for keys, allocating buffer for %d keys\n",keys); | ||
273 | 269 | + printf(" - Searching for keys, allocating buffer for %lu keys\n", keys); | ||
274 | 270 | |||
275 | 271 | if ((records=find_all_keys(info,keys,sort_keys,&buffpek,&maxbuffer, | ||
276 | 272 | &tempfile,&tempfile_for_exceptions)) | ||
277 | 273 | @@ -192,7 +193,7 @@ | ||
278 | 274 | { | ||
279 | 275 | if (!no_messages) | ||
280 | 276 | printf(" - Dumping %lu keys\n", (ulong) records); | ||
281 | 277 | - if (write_index(info,sort_keys, (uint) records)) | ||
282 | 278 | + if (write_index(info,sort_keys, (ulong) records)) | ||
283 | 279 | goto err; /* purecov: inspected */ | ||
284 | 280 | } | ||
285 | 281 | else | ||
286 | 282 | @@ -256,13 +257,13 @@ | ||
287 | 283 | |||
288 | 284 | /* Search after all keys and place them in a temp. file */ | ||
289 | 285 | |||
290 | 286 | -static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, uint keys, | ||
291 | 287 | +static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, ulong keys, | ||
292 | 288 | uchar **sort_keys, DYNAMIC_ARRAY *buffpek, | ||
293 | 289 | - int *maxbuffer, IO_CACHE *tempfile, | ||
294 | 290 | + long *maxbuffer, IO_CACHE *tempfile, | ||
295 | 291 | IO_CACHE *tempfile_for_exceptions) | ||
296 | 292 | { | ||
297 | 293 | int error; | ||
298 | 294 | - uint idx; | ||
299 | 295 | + ulong idx; | ||
300 | 296 | DBUG_ENTER("find_all_keys"); | ||
301 | 297 | |||
302 | 298 | idx=error=0; | ||
303 | 299 | @@ -312,8 +313,8 @@ | ||
304 | 300 | { | ||
305 | 301 | MI_SORT_PARAM *sort_param= (MI_SORT_PARAM*) arg; | ||
306 | 302 | int error; | ||
307 | 303 | - uint memavl,old_memavl,keys,sort_length; | ||
308 | 304 | - uint idx, maxbuffer; | ||
309 | 305 | + ulong memavl,old_memavl,keys,sort_length; | ||
310 | 306 | + ulong idx, maxbuffer; | ||
311 | 307 | uchar **sort_keys=0; | ||
312 | 308 | |||
313 | 309 | LINT_INIT(keys); | ||
314 | 310 | @@ -349,7 +350,7 @@ | ||
315 | 311 | sort_keys= (uchar **) NULL; | ||
316 | 312 | |||
317 | 313 | memavl= max(sort_param->sortbuff_size, MIN_SORT_BUFFER); | ||
318 | 314 | - idx= (uint)sort_param->sort_info->max_records; | ||
319 | 315 | + idx= (ulong) sort_param->sort_info->max_records; | ||
320 | 316 | sort_length= sort_param->key_length; | ||
321 | 317 | maxbuffer= 1; | ||
322 | 318 | |||
323 | 319 | @@ -360,21 +361,21 @@ | ||
324 | 320 | keys= idx+1; | ||
325 | 321 | else | ||
326 | 322 | { | ||
327 | 323 | - uint skr; | ||
328 | 324 | + ulong skr; | ||
329 | 325 | do | ||
330 | 326 | { | ||
331 | 327 | skr= maxbuffer; | ||
332 | 328 | if (memavl < sizeof(BUFFPEK)*maxbuffer || | ||
333 | 329 | (keys=(memavl-sizeof(BUFFPEK)*maxbuffer)/ | ||
334 | 330 | (sort_length+sizeof(char*))) <= 1 || | ||
335 | 331 | - keys < (uint) maxbuffer) | ||
336 | 332 | + keys < maxbuffer) | ||
337 | 333 | { | ||
338 | 334 | mi_check_print_error(sort_param->sort_info->param, | ||
339 | 335 | "myisam_sort_buffer_size is too small"); | ||
340 | 336 | goto err; | ||
341 | 337 | } | ||
342 | 338 | } | ||
343 | 339 | - while ((maxbuffer= (int) (idx/(keys-1)+1)) != skr); | ||
344 | 340 | + while ((maxbuffer= (idx/(keys-1)+1)) != skr); | ||
345 | 341 | } | ||
346 | 342 | if ((sort_keys= (uchar**) | ||
347 | 343 | my_malloc(keys*(sort_length+sizeof(char*))+ | ||
348 | 344 | @@ -403,7 +404,7 @@ | ||
349 | 345 | } | ||
350 | 346 | |||
351 | 347 | if (sort_param->sort_info->param->testflag & T_VERBOSE) | ||
352 | 348 | - printf("Key %d - Allocating buffer for %d keys\n", | ||
353 | 349 | + printf("Key %d - Allocating buffer for %lu keys\n", | ||
354 | 350 | sort_param->key + 1, keys); | ||
355 | 351 | sort_param->sort_keys= sort_keys; | ||
356 | 352 | |||
357 | 353 | @@ -560,7 +561,7 @@ | ||
358 | 354 | } | ||
359 | 355 | if (sinfo->buffpek.elements) | ||
360 | 356 | { | ||
361 | 357 | - uint maxbuffer=sinfo->buffpek.elements-1; | ||
362 | 358 | + ulong maxbuffer=sinfo->buffpek.elements-1; | ||
363 | 359 | if (!mergebuf) | ||
364 | 360 | { | ||
365 | 361 | length=param->sort_buffer_length; | ||
366 | 362 | @@ -583,7 +584,7 @@ | ||
367 | 363 | printf("Key %d - Merging %u keys\n",sinfo->key+1, sinfo->keys); | ||
368 | 364 | if (merge_many_buff(sinfo, keys, (uchar **)mergebuf, | ||
369 | 365 | dynamic_element(&sinfo->buffpek, 0, BUFFPEK *), | ||
370 | 366 | - (int*) &maxbuffer, &sinfo->tempfile)) | ||
371 | 367 | + (long *) &maxbuffer, &sinfo->tempfile)) | ||
372 | 368 | { | ||
373 | 369 | got_error=1; | ||
374 | 370 | continue; | ||
375 | 371 | @@ -648,7 +649,7 @@ | ||
376 | 372 | /* Write all keys in memory to file for later merge */ | ||
377 | 373 | |||
378 | 374 | static int NEAR_F write_keys(MI_SORT_PARAM *info, register uchar **sort_keys, | ||
379 | 375 | - uint count, BUFFPEK *buffpek, IO_CACHE *tempfile) | ||
380 | 376 | + ulong count, BUFFPEK *buffpek, IO_CACHE *tempfile) | ||
381 | 377 | { | ||
382 | 378 | uchar **end; | ||
383 | 379 | uint sort_length=info->key_length; | ||
384 | 380 | @@ -690,7 +691,7 @@ | ||
385 | 381 | |||
386 | 382 | static int NEAR_F write_keys_varlen(MI_SORT_PARAM *info, | ||
387 | 383 | register uchar **sort_keys, | ||
388 | 384 | - uint count, BUFFPEK *buffpek, | ||
389 | 385 | + ulong count, BUFFPEK *buffpek, | ||
390 | 386 | IO_CACHE *tempfile) | ||
391 | 387 | { | ||
392 | 388 | uchar **end; | ||
393 | 389 | @@ -736,7 +737,7 @@ | ||
394 | 390 | /* Write index */ | ||
395 | 391 | |||
396 | 392 | static int NEAR_F write_index(MI_SORT_PARAM *info, register uchar **sort_keys, | ||
397 | 393 | - register uint count) | ||
398 | 394 | + register ulong count) | ||
399 | 395 | { | ||
400 | 396 | DBUG_ENTER("write_index"); | ||
401 | 397 | |||
402 | 398 | @@ -753,11 +754,11 @@ | ||
403 | 399 | |||
404 | 400 | /* Merge buffers to make < MERGEBUFF2 buffers */ | ||
405 | 401 | |||
406 | 402 | -static int NEAR_F merge_many_buff(MI_SORT_PARAM *info, uint keys, | ||
407 | 403 | +static int NEAR_F merge_many_buff(MI_SORT_PARAM *info, ulong keys, | ||
408 | 404 | uchar **sort_keys, BUFFPEK *buffpek, | ||
409 | 405 | - int *maxbuffer, IO_CACHE *t_file) | ||
410 | 406 | + long *maxbuffer, IO_CACHE *t_file) | ||
411 | 407 | { | ||
412 | 408 | - register int i; | ||
413 | 409 | + register long i; | ||
414 | 410 | IO_CACHE t_file2, *from_file, *to_file, *temp; | ||
415 | 411 | BUFFPEK *lastbuff; | ||
416 | 412 | DBUG_ENTER("merge_many_buff"); | ||
417 | 413 | @@ -787,7 +788,7 @@ | ||
418 | 414 | if (flush_io_cache(to_file)) | ||
419 | 415 | break; /* purecov: inspected */ | ||
420 | 416 | temp=from_file; from_file=to_file; to_file=temp; | ||
421 | 417 | - *maxbuffer= (int) (lastbuff-buffpek)-1; | ||
422 | 418 | + *maxbuffer= (long) (lastbuff-buffpek)-1; | ||
423 | 419 | } | ||
424 | 420 | cleanup: | ||
425 | 421 | close_cached_file(to_file); /* This holds old result */ | ||
426 | 422 | @@ -816,17 +817,17 @@ | ||
427 | 423 | -1 Error | ||
428 | 424 | */ | ||
429 | 425 | |||
430 | 426 | -static uint NEAR_F read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek, | ||
431 | 427 | - uint sort_length) | ||
432 | 428 | +static ulong NEAR_F read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek, | ||
433 | 429 | + uint sort_length) | ||
434 | 430 | { | ||
435 | 431 | - register uint count; | ||
436 | 432 | - uint length; | ||
437 | 433 | + register ulong count; | ||
438 | 434 | + ulong length; | ||
439 | 435 | |||
440 | 436 | - if ((count=(uint) min((ha_rows) buffpek->max_keys,buffpek->count))) | ||
441 | 437 | + if ((count=(ulong) min((ha_rows) buffpek->max_keys,buffpek->count))) | ||
442 | 438 | { | ||
443 | 439 | if (my_pread(fromfile->file,(uchar*) buffpek->base, | ||
444 | 440 | (length= sort_length*count),buffpek->file_pos,MYF_RW)) | ||
445 | 441 | - return((uint) -1); /* purecov: inspected */ | ||
446 | 442 | + return((ulong) -1); /* purecov: inspected */ | ||
447 | 443 | buffpek->key=buffpek->base; | ||
448 | 444 | buffpek->file_pos+= length; /* New filepos */ | ||
449 | 445 | buffpek->count-= count; | ||
450 | 446 | @@ -835,15 +836,15 @@ | ||
451 | 447 | return (count*sort_length); | ||
452 | 448 | } /* read_to_buffer */ | ||
453 | 449 | |||
454 | 450 | -static uint NEAR_F read_to_buffer_varlen(IO_CACHE *fromfile, BUFFPEK *buffpek, | ||
455 | 451 | - uint sort_length) | ||
456 | 452 | +static ulong NEAR_F read_to_buffer_varlen(IO_CACHE *fromfile, BUFFPEK *buffpek, | ||
457 | 453 | + uint sort_length) | ||
458 | 454 | { | ||
459 | 455 | - register uint count; | ||
460 | 456 | + register ulong count; | ||
461 | 457 | uint16 length_of_key = 0; | ||
462 | 458 | - uint idx; | ||
463 | 459 | + ulong idx; | ||
464 | 460 | uchar *buffp; | ||
465 | 461 | |||
466 | 462 | - if ((count=(uint) min((ha_rows) buffpek->max_keys,buffpek->count))) | ||
467 | 463 | + if ((count= (ulong) min((ha_rows) buffpek->max_keys,buffpek->count))) | ||
468 | 464 | { | ||
469 | 465 | buffp = buffpek->base; | ||
470 | 466 | |||
471 | 467 | @@ -851,11 +852,11 @@ | ||
472 | 468 | { | ||
473 | 469 | if (my_pread(fromfile->file,(uchar*)&length_of_key,sizeof(length_of_key), | ||
474 | 470 | buffpek->file_pos,MYF_RW)) | ||
475 | 471 | - return((uint) -1); | ||
476 | 472 | + return((ulong) -1); | ||
477 | 473 | buffpek->file_pos+=sizeof(length_of_key); | ||
478 | 474 | if (my_pread(fromfile->file,(uchar*) buffp,length_of_key, | ||
479 | 475 | buffpek->file_pos,MYF_RW)) | ||
480 | 476 | - return((uint) -1); | ||
481 | 477 | + return((ulong) -1); | ||
482 | 478 | buffpek->file_pos+=length_of_key; | ||
483 | 479 | buffp = buffp + sort_length; | ||
484 | 480 | } | ||
485 | 481 | @@ -869,9 +870,9 @@ | ||
486 | 482 | |||
487 | 483 | static int NEAR_F write_merge_key_varlen(MI_SORT_PARAM *info, | ||
488 | 484 | IO_CACHE *to_file, uchar* key, | ||
489 | 485 | - uint sort_length, uint count) | ||
490 | 486 | + uint sort_length, ulong count) | ||
491 | 487 | { | ||
492 | 488 | - uint idx; | ||
493 | 489 | + ulong idx; | ||
494 | 490 | uchar *bufs = key; | ||
495 | 491 | |||
496 | 492 | for (idx=1;idx<=count;idx++) | ||
497 | 493 | @@ -887,7 +888,7 @@ | ||
498 | 494 | |||
499 | 495 | static int NEAR_F write_merge_key(MI_SORT_PARAM *info __attribute__((unused)), | ||
500 | 496 | IO_CACHE *to_file, uchar *key, | ||
501 | 497 | - uint sort_length, uint count) | ||
502 | 498 | + uint sort_length, ulong count) | ||
503 | 499 | { | ||
504 | 500 | return my_b_write(to_file, key, (size_t) sort_length*count); | ||
505 | 501 | } | ||
506 | 502 | @@ -898,12 +899,13 @@ | ||
507 | 503 | */ | ||
508 | 504 | |||
509 | 505 | static int NEAR_F | ||
510 | 506 | -merge_buffers(MI_SORT_PARAM *info, uint keys, IO_CACHE *from_file, | ||
511 | 507 | +merge_buffers(MI_SORT_PARAM *info, ulong keys, IO_CACHE *from_file, | ||
512 | 508 | IO_CACHE *to_file, uchar **sort_keys, BUFFPEK *lastbuff, | ||
513 | 509 | BUFFPEK *Fb, BUFFPEK *Tb) | ||
514 | 510 | { | ||
515 | 511 | - int error; | ||
516 | 512 | - uint sort_length,maxcount; | ||
517 | 513 | + ulong error; | ||
518 | 514 | + uint sort_length; | ||
519 | 515 | + ulong maxcount; | ||
520 | 516 | ha_rows count; | ||
521 | 517 | my_off_t UNINIT_VAR(to_start_filepos); | ||
522 | 518 | uchar *strpos; | ||
523 | 519 | @@ -913,7 +915,7 @@ | ||
524 | 520 | DBUG_ENTER("merge_buffers"); | ||
525 | 521 | |||
526 | 522 | count=error=0; | ||
527 | 523 | - maxcount=keys/((uint) (Tb-Fb) +1); | ||
528 | 524 | + maxcount= keys / ((ulong) (Tb-Fb) + 1); | ||
529 | 525 | DBUG_ASSERT(maxcount > 0); | ||
530 | 526 | LINT_INIT(to_start_filepos); | ||
531 | 527 | if (to_file) | ||
532 | 528 | @@ -921,7 +923,7 @@ | ||
533 | 529 | strpos=(uchar*) sort_keys; | ||
534 | 530 | sort_length=info->key_length; | ||
535 | 531 | |||
536 | 532 | - if (init_queue(&queue,(uint) (Tb-Fb)+1,offsetof(BUFFPEK,key),0, | ||
537 | 533 | + if (init_queue(&queue, (uint) (Tb-Fb)+1, offsetof(BUFFPEK,key), 0, | ||
538 | 534 | (int (*)(void*, uchar *,uchar*)) info->key_cmp, | ||
539 | 535 | (void*) info)) | ||
540 | 536 | DBUG_RETURN(1); /* purecov: inspected */ | ||
541 | 537 | @@ -931,9 +933,8 @@ | ||
542 | 538 | count+= buffpek->count; | ||
543 | 539 | buffpek->base= strpos; | ||
544 | 540 | buffpek->max_keys=maxcount; | ||
545 | 541 | - strpos+= (uint) (error=(int) info->read_to_buffer(from_file,buffpek, | ||
546 | 542 | - sort_length)); | ||
547 | 543 | - if (error == -1) | ||
548 | 544 | + strpos+= (error= info->read_to_buffer(from_file,buffpek, sort_length)); | ||
549 | 545 | + if (error == (ulong) -1) | ||
550 | 546 | goto err; /* purecov: inspected */ | ||
551 | 547 | queue_insert(&queue,(uchar*) buffpek); | ||
552 | 548 | } | ||
553 | 549 | @@ -965,10 +966,10 @@ | ||
554 | 550 | buffpek->key+=sort_length; | ||
555 | 551 | if (! --buffpek->mem_count) | ||
556 | 552 | { | ||
557 | 553 | - if (!(error=(int) info->read_to_buffer(from_file,buffpek,sort_length))) | ||
558 | 554 | + if (!(error= info->read_to_buffer(from_file,buffpek,sort_length))) | ||
559 | 555 | { | ||
560 | 556 | uchar *base=buffpek->base; | ||
561 | 557 | - uint max_keys=buffpek->max_keys; | ||
562 | 558 | + ulong max_keys=buffpek->max_keys; | ||
563 | 559 | |||
564 | 560 | VOID(queue_remove(&queue,0)); | ||
565 | 561 | |||
566 | 562 | @@ -993,7 +994,7 @@ | ||
567 | 563 | break; /* One buffer have been removed */ | ||
568 | 564 | } | ||
569 | 565 | } | ||
570 | 566 | - else if (error == -1) | ||
571 | 567 | + else if (error == (ulong) -1) | ||
572 | 568 | goto err; /* purecov: inspected */ | ||
573 | 569 | queue_replaced(&queue); /* Top element has been replaced */ | ||
574 | 570 | } | ||
575 | 571 | @@ -1026,23 +1027,23 @@ | ||
576 | 572 | } | ||
577 | 573 | } | ||
578 | 574 | } | ||
579 | 575 | - while ((error=(int) info->read_to_buffer(from_file,buffpek,sort_length)) != -1 && | ||
580 | 576 | - error != 0); | ||
581 | 577 | + while ((error= info->read_to_buffer(from_file, buffpek, sort_length)) != | ||
582 | 578 | + (ulong) -1 && error != 0); | ||
583 | 579 | |||
584 | 580 | lastbuff->count=count; | ||
585 | 581 | if (to_file) | ||
586 | 582 | lastbuff->file_pos=to_start_filepos; | ||
587 | 583 | err: | ||
588 | 584 | delete_queue(&queue); | ||
589 | 585 | - DBUG_RETURN(error); | ||
590 | 586 | + DBUG_RETURN(error != 0); | ||
591 | 587 | } /* merge_buffers */ | ||
592 | 588 | |||
593 | 589 | |||
594 | 590 | /* Do a merge to output-file (save only positions) */ | ||
595 | 591 | |||
596 | 592 | static int NEAR_F | ||
597 | 593 | -merge_index(MI_SORT_PARAM *info, uint keys, uchar **sort_keys, | ||
598 | 594 | - BUFFPEK *buffpek, int maxbuffer, IO_CACHE *tempfile) | ||
599 | 595 | +merge_index(MI_SORT_PARAM *info, ulong keys, uchar **sort_keys, | ||
600 | 596 | + BUFFPEK *buffpek, long maxbuffer, IO_CACHE *tempfile) | ||
601 | 597 | { | ||
602 | 598 | DBUG_ENTER("merge_index"); | ||
603 | 599 | if (merge_buffers(info,keys,tempfile,(IO_CACHE*) 0,sort_keys,buffpek,buffpek, | ||
604 | 600 | --- /dev/null | ||
605 | 601 | +++ b/mysql-test/r/percona_bug45702.result | ||
606 | 602 | @@ -0,0 +1,21 @@ | ||
607 | 603 | +CREATE TABLE t1 (a BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM; | ||
608 | 604 | +INSERT INTO t1 VALUES (), (), (), (), (), (), (), (); | ||
609 | 605 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
610 | 606 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
611 | 607 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
612 | 608 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
613 | 609 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
614 | 610 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
615 | 611 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
616 | 612 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
617 | 613 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
618 | 614 | +SET @old_myisam_sort_buffer_size = @@myisam_sort_buffer_size; | ||
619 | 615 | +SET @@myisam_sort_buffer_size = 4 * 1024 * 1024 * 1024; | ||
620 | 616 | +REPAIR TABLE t1; | ||
621 | 617 | +Table Op Msg_type Msg_text | ||
622 | 618 | +test.t1 repair status OK | ||
623 | 619 | +- recovering (with sort) MyISAM-table 'MYSQLD_DATADIR/test/t1' | ||
624 | 620 | +Data records: 4096 | ||
625 | 621 | +- Fixing index 1 | ||
626 | 622 | +SET @@myisam_sort_buffer_size = @old_myisam_sort_buffer_size; | ||
627 | 623 | +DROP TABLE t1; | ||
628 | 624 | --- /dev/null | ||
629 | 625 | +++ b/mysql-test/t/percona_bug45702.test | ||
630 | 626 | @@ -0,0 +1,34 @@ | ||
631 | 627 | +############################################################################### | ||
632 | 628 | +# Bug #45702: Impossible to specify myisam_sort_buffer > 4GB on 64 bit machines | ||
633 | 629 | +############################################################################### | ||
634 | 630 | + | ||
635 | 631 | +--source include/have_64bit.inc | ||
636 | 632 | + | ||
637 | 633 | +# Check that having data larger than MIN_SORT_BUFFER bytes can be handled by | ||
638 | 634 | +# _create_index_by_sort() with myisam_sort_buffer_size = 4 GB without errors. | ||
639 | 635 | +# The full test with large data volumes can not be a part of the test suite. | ||
640 | 636 | + | ||
641 | 637 | +CREATE TABLE t1 (a BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM; | ||
642 | 638 | +INSERT INTO t1 VALUES (), (), (), (), (), (), (), (); | ||
643 | 639 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
644 | 640 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
645 | 641 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
646 | 642 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
647 | 643 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
648 | 644 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
649 | 645 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
650 | 646 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
651 | 647 | +INSERT INTO t1 SELECT NULL FROM t1; | ||
652 | 648 | + | ||
653 | 649 | +SET @old_myisam_sort_buffer_size = @@myisam_sort_buffer_size; | ||
654 | 650 | +SET @@myisam_sort_buffer_size = 4 * 1024 * 1024 * 1024; | ||
655 | 651 | + | ||
656 | 652 | +REPAIR TABLE t1; | ||
657 | 653 | + | ||
658 | 654 | +--let $MYSQLD_DATADIR= `select @@datadir` | ||
659 | 655 | +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR | ||
660 | 656 | +--exec $MYISAMCHK -r --sort_buffer_size=4G $MYSQLD_DATADIR/test/t1 | ||
661 | 657 | + | ||
662 | 658 | +SET @@myisam_sort_buffer_size = @old_myisam_sort_buffer_size; | ||
663 | 659 | + | ||
664 | 660 | +DROP TABLE t1; | ||
665 | 661 | --- a/sql/opt_range.cc | ||
666 | 662 | +++ b/sql/opt_range.cc | ||
667 | 663 | @@ -11524,7 +11524,7 @@ | ||
668 | 664 | } | ||
669 | 665 | if (min_max_ranges.elements > 0) | ||
670 | 666 | { | ||
671 | 667 | - fprintf(DBUG_FILE, "%*susing %d quick_ranges for MIN/MAX:\n", | ||
672 | 668 | + fprintf(DBUG_FILE, "%*susing %lu quick_ranges for MIN/MAX:\n", | ||
673 | 669 | indent, "", min_max_ranges.elements); | ||
674 | 670 | } | ||
675 | 671 | } | ||
676 | 672 | --- a/mysys/my_pread.c | ||
677 | 673 | +++ b/mysys/my_pread.c | ||
678 | 674 | @@ -48,6 +48,7 @@ | ||
679 | 675 | myf MyFlags) | ||
680 | 676 | { | ||
681 | 677 | size_t readbytes; | ||
682 | 678 | + size_t total_readbytes= 0; | ||
683 | 679 | int error= 0; | ||
684 | 680 | DBUG_ENTER("my_pread"); | ||
685 | 681 | DBUG_PRINT("my",("Fd: %d Seek: %lu Buffer: 0x%lx Count: %u MyFlags: %d", | ||
686 | 682 | @@ -68,6 +69,9 @@ | ||
687 | 683 | if ((error= ((readbytes= pread(Filedes, Buffer, Count, offset)) != Count))) | ||
688 | 684 | my_errno= errno ? errno : -1; | ||
689 | 685 | #endif | ||
690 | 686 | + if (readbytes > 0) | ||
691 | 687 | + total_readbytes+= readbytes; | ||
692 | 688 | + | ||
693 | 689 | if (error || readbytes != Count) | ||
694 | 690 | { | ||
695 | 691 | DBUG_PRINT("warning",("Read only %d bytes off %u from %d, errno: %d", | ||
696 | 692 | @@ -80,6 +84,24 @@ | ||
697 | 693 | continue; /* Interrupted */ | ||
698 | 694 | } | ||
699 | 695 | #endif | ||
700 | 696 | + if (readbytes > 0 && readbytes < Count && errno == 0) | ||
701 | 697 | + { | ||
702 | 698 | + /* | ||
703 | 699 | + pread() may return less bytes than requested even if enough bytes are | ||
704 | 700 | + available according to the Linux man page. | ||
705 | 701 | + This makes determining the end-of-file condition a bit harder. | ||
706 | 702 | + We just do another pread() call to see if more bytes can be read, | ||
707 | 703 | + since all my_pread() users expect it to always return all available | ||
708 | 704 | + bytes. For end-of-file 0 bytes is returned. This can never be the case | ||
709 | 705 | + for a partial read, since according to the man page, -1 is returned | ||
710 | 706 | + with errno set to EINTR if no data has been read. | ||
711 | 707 | + */ | ||
712 | 708 | + Buffer+= readbytes; | ||
713 | 709 | + offset+= readbytes; | ||
714 | 710 | + Count-= readbytes; | ||
715 | 711 | + | ||
716 | 712 | + continue; | ||
717 | 713 | + } | ||
718 | 714 | if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) | ||
719 | 715 | { | ||
720 | 716 | if (readbytes == (size_t) -1) | ||
721 | 717 | @@ -94,7 +116,7 @@ | ||
722 | 718 | } | ||
723 | 719 | if (MyFlags & (MY_NABP | MY_FNABP)) | ||
724 | 720 | DBUG_RETURN(0); /* Read went ok; Return 0 */ | ||
725 | 721 | - DBUG_RETURN(readbytes); /* purecov: inspected */ | ||
726 | 722 | + DBUG_RETURN(total_readbytes); /* purecov: inspected */ | ||
727 | 723 | } | ||
728 | 724 | } /* my_pread */ | ||
729 | 725 | |||
730 | 0 | 726 | ||
731 | === modified file 'patches/series' | |||
732 | --- patches/series 2011-10-08 00:17:56 +0000 | |||
733 | +++ patches/series 2011-10-26 19:30:29 +0000 | |||
734 | @@ -65,3 +65,4 @@ | |||
735 | 65 | bug53761.patch | 65 | bug53761.patch |
736 | 66 | xtradb_bug317074.patch | 66 | xtradb_bug317074.patch |
737 | 67 | subunit.patch | 67 | subunit.patch |
738 | 68 | bug45702.patch |
http:// jenkins. percona. com/view/ Percona% 20Server% 205.1/job/ percona- server- 5.1-param/ 186/