30
30
#include <algorithm>
31
31
#include <iostream>
33
#include <drizzled/drizzled.h>
34
#include <drizzled/sql_sort.h>
35
#include <drizzled/filesort.h>
36
#include <drizzled/error.h>
37
#include <drizzled/probes.h>
38
#include <drizzled/session.h>
39
#include <drizzled/table.h>
40
#include <drizzled/table_list.h>
41
#include <drizzled/optimizer/range.h>
42
#include <drizzled/records.h>
43
#include <drizzled/internal/iocache.h>
44
#include <drizzled/internal/my_sys.h>
45
#include <plugin/myisam/myisam.h>
46
#include <drizzled/plugin/transactional_storage_engine.h>
47
#include <drizzled/atomics.h>
48
#include <drizzled/global_buffer.h>
49
#include <drizzled/sort_field.h>
50
#include <drizzled/item/subselect.h>
51
#include <drizzled/statistics_variables.h>
52
#include <drizzled/system_variables.h>
33
#include "drizzled/drizzled.h"
34
#include "drizzled/sql_sort.h"
35
#include "drizzled/filesort.h"
36
#include "drizzled/error.h"
37
#include "drizzled/probes.h"
38
#include "drizzled/session.h"
39
#include "drizzled/table.h"
40
#include "drizzled/table_list.h"
41
#include "drizzled/optimizer/range.h"
42
#include "drizzled/records.h"
43
#include "drizzled/internal/iocache.h"
44
#include "drizzled/internal/my_sys.h"
45
#include "plugin/myisam/myisam.h"
46
#include "drizzled/plugin/transactional_storage_engine.h"
47
#include "drizzled/atomics.h"
48
#include "drizzled/global_buffer.h"
54
51
using namespace std;
58
56
/* Defines used by filesort and uniques */
59
57
#define MERGEBUFF 7
121
119
int write_keys(unsigned char * *sort_keys,
123
internal::io_cache_st *buffer_file,
124
internal::io_cache_st *tempfile);
121
internal::IO_CACHE *buffer_file,
122
internal::IO_CACHE *tempfile);
126
124
void make_sortkey(unsigned char *to,
127
125
unsigned char *ref_pos);
135
133
/* functions defined in this file */
137
static char **make_char_array(char **old_pos, uint32_t fields,
135
static char **make_char_array(char **old_pos, register uint32_t fields,
138
136
uint32_t length);
140
static unsigned char *read_buffpek_from_file(internal::io_cache_st *buffer_file,
138
static unsigned char *read_buffpek_from_file(internal::IO_CACHE *buffer_file,
142
140
unsigned char *buf);
196
194
buffpek *buffpek_inst= 0;
197
195
ha_rows records= HA_POS_ERROR;
198
196
unsigned char **sort_keys= 0;
199
internal::io_cache_st tempfile;
200
internal::io_cache_st buffpek_pointers;
201
internal::io_cache_st *selected_records_file;
202
internal::io_cache_st *outfile;
197
internal::IO_CACHE tempfile;
198
internal::IO_CACHE buffpek_pointers;
199
internal::IO_CACHE *selected_records_file;
200
internal::IO_CACHE *outfile;
204
202
bool multi_byte_charset;
457
455
/** Make a array of string pointers. */
459
static char **make_char_array(char **old_pos, uint32_t fields,
457
static char **make_char_array(char **old_pos, register uint32_t fields,
476
474
/** Read 'count' number of buffer pointers into memory. */
478
static unsigned char *read_buffpek_from_file(internal::io_cache_st *buffpek_pointers, uint32_t count,
476
static unsigned char *read_buffpek_from_file(internal::IO_CACHE *buffpek_pointers, uint32_t count,
479
477
unsigned char *buf)
481
479
uint32_t length= sizeof(buffpek)*count;
537
535
ha_rows FileSort::find_all_keys(SortParam *param,
538
536
optimizer::SqlSelect *select,
539
537
unsigned char **sort_keys,
540
internal::io_cache_st *buffpek_pointers,
541
internal::io_cache_st *tempfile, internal::io_cache_st *indexfile)
538
internal::IO_CACHE *buffpek_pointers,
539
internal::IO_CACHE *tempfile, internal::IO_CACHE *indexfile)
543
541
int error,flag,quick_select;
544
542
uint32_t idx,indexpos,ref_length;
726
int SortParam::write_keys(unsigned char **sort_keys, uint32_t count,
727
internal::io_cache_st *buffpek_pointers, internal::io_cache_st *tempfile)
724
int SortParam::write_keys(register unsigned char **sort_keys, uint32_t count,
725
internal::IO_CACHE *buffpek_pointers, internal::IO_CACHE *tempfile)
825
823
switch (sort_field->result_type) {
826
824
case STRING_RESULT:
828
const charset_info_st * const cs=item->collation.collation;
826
const CHARSET_INFO * const cs=item->collation.collation;
829
827
char fill_char= ((cs->state & MY_CS_BINSORT) ? (char) 0 : ' ');
831
829
uint32_t sort_field_length;
1088
1086
/** Merge buffers to make < MERGEBUFF2 buffers. */
1090
1088
int FileSort::merge_many_buff(SortParam *param, unsigned char *sort_buffer,
1091
buffpek *buffpek_inst, uint32_t *maxbuffer, internal::io_cache_st *t_file)
1089
buffpek *buffpek_inst, uint32_t *maxbuffer, internal::IO_CACHE *t_file)
1093
internal::io_cache_st t_file2,*from_file,*to_file,*temp;
1091
internal::IO_CACHE t_file2,*from_file,*to_file,*temp;
1094
1092
buffpek *lastbuff;
1096
1094
if (*maxbuffer < MERGEBUFF2)
1104
1102
from_file= t_file ; to_file= &t_file2;
1105
1103
while (*maxbuffer >= MERGEBUFF2)
1105
register uint32_t i;
1109
1107
if (from_file->reinit_io_cache(internal::READ_CACHE,0L,0,0))
1162
1160
(uint32_t)-1 if something goes wrong
1165
uint32_t FileSort::read_to_buffer(internal::io_cache_st *fromfile, buffpek *buffpek_inst, uint32_t rec_length)
1163
uint32_t FileSort::read_to_buffer(internal::IO_CACHE *fromfile, buffpek *buffpek_inst, uint32_t rec_length)
1165
register uint32_t count;
1168
1166
uint32_t length;
1170
1168
if ((count= (uint32_t) min((ha_rows) buffpek_inst->max_keys,buffpek_inst->count)))
1222
int FileSort::merge_buffers(SortParam *param, internal::io_cache_st *from_file,
1223
internal::io_cache_st *to_file, unsigned char *sort_buffer,
1220
int FileSort::merge_buffers(SortParam *param, internal::IO_CACHE *from_file,
1221
internal::IO_CACHE *to_file, unsigned char *sort_buffer,
1224
1222
buffpek *lastbuff, buffpek *Fb, buffpek *Tb,
1435
1433
int FileSort::merge_index(SortParam *param, unsigned char *sort_buffer,
1436
1434
buffpek *buffpek_inst, uint32_t maxbuffer,
1437
internal::io_cache_st *tempfile, internal::io_cache_st *outfile)
1435
internal::IO_CACHE *tempfile, internal::IO_CACHE *outfile)
1439
1437
if (merge_buffers(param,tempfile,outfile,sort_buffer,buffpek_inst,buffpek_inst,
1440
1438
buffpek_inst+maxbuffer,1))