~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/filesort.cc

  • Committer: Monty Taylor
  • Date: 2011-02-13 17:26:39 UTC
  • mfrom: (2157.2.2 give-in-to-pkg-config)
  • mto: This revision was merged to the branch mainline in revision 2166.
  • Revision ID: mordred@inaugust.com-20110213172639-nhy7i72sfhoq13ms
Merged in pkg-config fixes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
  Sorts a database
22
22
*/
23
23
 
24
 
#include <config.h>
 
24
#include "config.h"
25
25
 
26
26
#include <float.h>
27
27
#include <limits.h>
30
30
#include <algorithm>
31
31
#include <iostream>
32
32
 
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"
 
49
 
53
50
 
54
51
using namespace std;
55
52
 
56
 
namespace drizzled {
 
53
namespace drizzled
 
54
{
57
55
 
58
56
/* Defines used by filesort and uniques */
59
57
#define MERGEBUFF               7
120
118
 
121
119
  int write_keys(unsigned char * *sort_keys,
122
120
                 uint32_t count,
123
 
                 internal::io_cache_st *buffer_file,
124
 
                 internal::io_cache_st *tempfile);
 
121
                 internal::IO_CACHE *buffer_file,
 
122
                 internal::IO_CACHE *tempfile);
125
123
 
126
124
  void make_sortkey(unsigned char *to,
127
125
                    unsigned char *ref_pos);
134
132
 
135
133
/* functions defined in this file */
136
134
 
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);
139
137
 
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,
141
139
                                             uint32_t count,
142
140
                                             unsigned char *buf);
143
141
 
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;
203
201
  SortParam param;
204
202
  bool multi_byte_charset;
205
203
 
456
454
 
457
455
/** Make a array of string pointers. */
458
456
 
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,
460
458
                              uint32_t length)
461
459
{
462
 
  char **pos;
 
460
  register char **pos;
463
461
  char *char_pos;
464
462
 
465
463
  if (old_pos ||
475
473
 
476
474
/** Read 'count' number of buffer pointers into memory. */
477
475
 
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)
480
478
{
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)
542
540
{
543
541
  int error,flag,quick_select;
544
542
  uint32_t idx,indexpos,ref_length;
723
721
    1 Error
724
722
*/
725
723
 
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)
728
726
{
729
727
  buffpek buffpek;
730
728
 
788
786
 
789
787
/** Make a sort-key from record. */
790
788
 
791
 
void SortParam::make_sortkey(unsigned char *to, unsigned char *ref_pos)
 
789
void SortParam::make_sortkey(register unsigned char *to, unsigned char *ref_pos)
792
790
{
793
791
  Field *field;
794
792
  SortField *sort_field;
825
823
      switch (sort_field->result_type) {
826
824
      case STRING_RESULT:
827
825
        {
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 : ' ');
830
828
          int diff;
831
829
          uint32_t sort_field_length;
1021
1019
 
1022
1020
 
1023
1021
/*
1024
 
  fields used by sorting in the sorted table's read set
 
1022
  Register fields used by sorting in the sorted table's read set
1025
1023
*/
1026
1024
 
1027
1025
void SortParam::register_used_fields()
1088
1086
/** Merge buffers to make < MERGEBUFF2 buffers. */
1089
1087
 
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)
1092
1090
{
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;
1095
1093
 
1096
1094
  if (*maxbuffer < MERGEBUFF2)
1104
1102
  from_file= t_file ; to_file= &t_file2;
1105
1103
  while (*maxbuffer >= MERGEBUFF2)
1106
1104
  {
1107
 
    uint32_t i;
 
1105
    register uint32_t i;
1108
1106
 
1109
1107
    if (from_file->reinit_io_cache(internal::READ_CACHE,0L,0,0))
1110
1108
    {
1162
1160
    (uint32_t)-1 if something goes wrong
1163
1161
*/
1164
1162
 
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)
1166
1164
{
1167
 
  uint32_t count;
 
1165
  register uint32_t count;
1168
1166
  uint32_t length;
1169
1167
 
1170
1168
  if ((count= (uint32_t) min((ha_rows) buffpek_inst->max_keys,buffpek_inst->count)))
1219
1217
    other  error
1220
1218
*/
1221
1219
 
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,
1225
1223
                            int flag)
1226
1224
{
1405
1403
    }
1406
1404
    else
1407
1405
    {
1408
 
      unsigned char *end;
 
1406
      register unsigned char *end;
1409
1407
      strpos= buffpek_inst->key+offset;
1410
1408
      for (end= strpos+buffpek_inst->mem_count*rec_length ;
1411
1409
           strpos != end ;
1434
1432
 
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)
1438
1436
{
1439
1437
  if (merge_buffers(param,tempfile,outfile,sort_buffer,buffpek_inst,buffpek_inst,
1440
1438
                    buffpek_inst+maxbuffer,1))
1476
1474
 
1477
1475
uint32_t FileSort::sortlength(SortField *sortorder, uint32_t s_length, bool *multi_byte_charset)
1478
1476
{
1479
 
  uint32_t length;
1480
 
  const charset_info_st *cs;
 
1477
  register uint32_t length;
 
1478
  const CHARSET_INFO *cs;
1481
1479
  *multi_byte_charset= 0;
1482
1480
 
1483
1481
  length=0;