~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
1 by brian
clean slate
19
20
21
/* classes to use when handling where clause */
22
327.2.3 by Brian Aker
Refactoring of class Table
23
#ifndef DRIZZLED_OPT_RANGE_H
24
#define DRIZZLED_OPT_RANGE_H
1 by brian
clean slate
25
584.1.14 by Monty Taylor
Removed field.h from common_includes.
26
#include <drizzled/field.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
27
#include <drizzled/item/sum.h>
957.1.2 by Padraig O'Sullivan
Whoops, for to have the proper include directive for std::priority_queue
28
#include <queue>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
29
30
class JOIN;
31
typedef class Item COND;
32
33
typedef struct st_handler_buffer HANDLER_BUFFER;
1 by brian
clean slate
34
35
typedef struct st_key_part {
206 by Brian Aker
Removed final uint dead types.
36
  uint16_t           key,part;
1 by brian
clean slate
37
  /* See KEY_PART_INFO for meaning of the next two: */
206 by Brian Aker
Removed final uint dead types.
38
  uint16_t           store_length, length;
39
  uint8_t            null_bit;
1 by brian
clean slate
40
  /*
41
    Keypart flags (0 when this structure is used by partition pruning code
42
    for fake partitioning index description)
43
  */
206 by Brian Aker
Removed final uint dead types.
44
  uint8_t flag;
1 by brian
clean slate
45
  Field            *field;
46
  Field::imagetype image_type;
47
} KEY_PART;
48
49
50
class QUICK_RANGE :public Sql_alloc {
51
 public:
481 by Brian Aker
Remove all of uchar.
52
  unsigned char *min_key,*max_key;
206 by Brian Aker
Removed final uint dead types.
53
  uint16_t min_length,max_length,flag;
1 by brian
clean slate
54
  key_part_map min_keypart_map, // bitmap of used keyparts in min_key
55
               max_keypart_map; // bitmap of used keyparts in max_key
56
#ifdef HAVE_purify
206 by Brian Aker
Removed final uint dead types.
57
  uint16_t dummy;					/* Avoid warnings on 'flag' */
1 by brian
clean slate
58
#endif
59
  QUICK_RANGE();				/* Full range */
482 by Brian Aker
Remove uint.
60
  QUICK_RANGE(const unsigned char *min_key_arg, uint32_t min_length_arg,
1 by brian
clean slate
61
              key_part_map min_keypart_map_arg,
482 by Brian Aker
Remove uint.
62
	      const unsigned char *max_key_arg, uint32_t max_length_arg,
1 by brian
clean slate
63
              key_part_map max_keypart_map_arg,
482 by Brian Aker
Remove uint.
64
	      uint32_t flag_arg)
481 by Brian Aker
Remove all of uchar.
65
    : min_key((unsigned char*) sql_memdup(min_key_arg,min_length_arg+1)),
66
      max_key((unsigned char*) sql_memdup(max_key_arg,max_length_arg+1)),
206 by Brian Aker
Removed final uint dead types.
67
      min_length((uint16_t) min_length_arg),
68
      max_length((uint16_t) max_length_arg),
69
      flag((uint16_t) flag_arg),
1 by brian
clean slate
70
      min_keypart_map(min_keypart_map_arg),
71
      max_keypart_map(max_keypart_map_arg)
72
    {
73
#ifdef HAVE_purify
74
      dummy=0;
75
#endif
76
    }
77
};
78
79
80
/*
81
  Quick select interface.
160.1.2 by mark
remove FTPARSER and last remains of full text search
82
  This class is a parent for all QUICK_*_SELECT classes.
1 by brian
clean slate
83
84
  The usage scenario is as follows:
85
  1. Create quick select
86
    quick= new QUICK_XXX_SELECT(...);
87
88
  2. Perform lightweight initialization. This can be done in 2 ways:
89
  2.a: Regular initialization
90
    if (quick->init())
91
    {
92
      //the only valid action after failed init() call is delete
93
      delete quick;
94
    }
95
  2.b: Special initialization for quick selects merged by QUICK_ROR_*_SELECT
96
    if (quick->init_ror_merged_scan())
97
      delete quick;
98
99
  3. Perform zero, one, or more scans.
100
    while (...)
101
    {
102
      // initialize quick select for scan. This may allocate
103
      // buffers and/or prefetch rows.
104
      if (quick->reset())
105
      {
106
        //the only valid action after failed reset() call is delete
107
        delete quick;
108
        //abort query
109
      }
110
111
      // perform the scan
112
      do
113
      {
114
        res= quick->get_next();
115
      } while (res && ...)
116
    }
117
118
  4. Delete the select:
119
    delete quick;
120
121
*/
122
123
class QUICK_SELECT_I
124
{
125
public:
126
  bool sorted;
127
  ha_rows records;  /* estimate of # of records to be retrieved */
128
  double  read_time; /* time to perform this retrieval          */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
129
  Table   *head;
1 by brian
clean slate
130
  /*
131
    Index this quick select uses, or MAX_KEY for quick selects
132
    that use several indexes
133
  */
482 by Brian Aker
Remove uint.
134
  uint32_t index;
1 by brian
clean slate
135
136
  /*
137
    Total length of first used_key_parts parts of the key.
138
    Applicable if index!= MAX_KEY.
139
  */
482 by Brian Aker
Remove uint.
140
  uint32_t max_used_key_length;
1 by brian
clean slate
141
142
  /*
143
    Max. number of (first) key parts this quick select uses for retrieval.
144
    eg. for "(key1p1=c1 AND key1p2=c2) OR key1p1=c2" used_key_parts == 2.
145
    Applicable if index!= MAX_KEY.
146
147
    For QUICK_GROUP_MIN_MAX_SELECT it includes MIN/MAX argument keyparts.
148
  */
482 by Brian Aker
Remove uint.
149
  uint32_t used_key_parts;
1 by brian
clean slate
150
151
  QUICK_SELECT_I();
152
  virtual ~QUICK_SELECT_I(){};
153
154
  /*
155
    Do post-constructor initialization.
156
    SYNOPSIS
157
      init()
158
159
    init() performs initializations that should have been in constructor if
160
    it was possible to return errors from constructors. The join optimizer may
161
    create and then delete quick selects without retrieving any rows so init()
162
    must not contain any IO or CPU intensive code.
163
164
    If init() call fails the only valid action is to delete this quick select,
165
    reset() and get_next() must not be called.
166
167
    RETURN
168
      0      OK
169
      other  Error code
170
  */
171
  virtual int  init() = 0;
172
173
  /*
174
    Initialize quick select for row retrieval.
175
    SYNOPSIS
176
      reset()
177
178
    reset() should be called when it is certain that row retrieval will be
179
    necessary. This call may do heavyweight initialization like buffering first
180
    N records etc. If reset() call fails get_next() must not be called.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
181
    Note that reset() may be called several times if
1 by brian
clean slate
182
     * the quick select is executed in a subselect
183
     * a JOIN buffer is used
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
184
1 by brian
clean slate
185
    RETURN
186
      0      OK
187
      other  Error code
188
  */
189
  virtual int  reset(void) = 0;
190
191
  virtual int  get_next() = 0;   /* get next record to retrieve */
192
193
  /* Range end should be called when we have looped over the whole index */
194
  virtual void range_end() {}
195
196
  virtual bool reverse_sorted() = 0;
197
  virtual bool unique_key_range() { return false; }
198
199
  enum {
200
    QS_TYPE_RANGE = 0,
201
    QS_TYPE_INDEX_MERGE = 1,
202
    QS_TYPE_RANGE_DESC = 2,
203
    QS_TYPE_ROR_INTERSECT = 4,
204
    QS_TYPE_ROR_UNION = 5,
205
    QS_TYPE_GROUP_MIN_MAX = 6
206
  };
207
208
  /* Get type of this quick select - one of the QS_TYPE_* values */
209
  virtual int get_type() = 0;
210
211
  /*
212
    Initialize this quick select as a merged scan inside a ROR-union or a ROR-
213
    intersection scan. The caller must not additionally call init() if this
214
    function is called.
215
    SYNOPSIS
216
      init_ror_merged_scan()
217
        reuse_handler  If true, the quick select may use table->handler,
218
                       otherwise it must create and use a separate handler
219
                       object.
220
    RETURN
221
      0     Ok
222
      other Error
223
  */
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
224
  virtual int init_ror_merged_scan(bool)
51.1.11 by Jay Pipes
Removed/replaced all DBUG_XXX statements, all conditional compilation directives for DBUG_OFF, but kept in the optimizer's custom debugging print code for now.
225
  { assert(0); return 1; }
1 by brian
clean slate
226
227
  /*
228
    Save ROWID of last retrieved row in file->ref. This used in ROR-merging.
229
  */
230
  virtual void save_last_pos(){};
231
232
  /*
233
    Append comma-separated list of keys this quick select uses to key_names;
234
    append comma-separated list of corresponding used lengths to used_lengths.
235
    This is used by select_describe.
236
  */
237
  virtual void add_keys_and_lengths(String *key_names,
238
                                    String *used_lengths)=0;
239
240
  /*
241
    Append text representation of quick select structure (what and how is
242
    merged) to str. The result is added to "Extra" field in EXPLAIN output.
243
    This function is implemented only by quick selects that merge other quick
244
    selects output and/or can produce output suitable for merging.
245
  */
520.9.3 by mordred
zomg. Solaris actually builds all the way!!!
246
  virtual void add_info_string(String *) {};
1 by brian
clean slate
247
  /*
248
    Return 1 if any index used by this quick select
249
    uses field which is marked in passed bitmap.
250
  */
1005.2.3 by Monty Taylor
Further reversion of P.
251
  virtual bool is_keys_used(const MY_BITMAP *fields);
1 by brian
clean slate
252
253
  /*
254
    rowid of last row retrieved by this quick select. This is used only when
255
    doing ROR-index_merge selects
256
  */
481 by Brian Aker
Remove all of uchar.
257
  unsigned char    *last_rowid;
1 by brian
clean slate
258
259
  /*
260
    Table record buffer used by this quick select.
261
  */
481 by Brian Aker
Remove all of uchar.
262
  unsigned char    *record;
1 by brian
clean slate
263
};
264
265
266
struct st_qsel_param;
267
class PARAM;
268
class SEL_ARG;
269
270
271
/*
272
  MRR range sequence, array<QUICK_RANGE> implementation: sequence traversal
273
  context.
274
*/
275
typedef struct st_quick_range_seq_ctx
276
{
277
  QUICK_RANGE **first;
278
  QUICK_RANGE **cur;
279
  QUICK_RANGE **last;
280
} QUICK_RANGE_SEQ_CTX;
281
482 by Brian Aker
Remove uint.
282
range_seq_t quick_range_seq_init(void *init_param, uint32_t n_ranges, uint32_t flags);
283
uint32_t quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
1 by brian
clean slate
284
285
286
/*
287
  Quick select that does a range scan on a single key. The records are
288
  returned in key order.
289
*/
290
class QUICK_RANGE_SELECT : public QUICK_SELECT_I
291
{
292
protected:
293
  handler *file;
294
  DYNAMIC_ARRAY ranges;     /* ordered array of range ptrs */
295
296
  /* Members to deal with case when this quick select is a ROR-merged scan */
297
  bool in_ror_merged_scan;
1005.2.3 by Monty Taylor
Further reversion of P.
298
  MY_BITMAP column_bitmap, *save_read_set, *save_write_set;
1 by brian
clean slate
299
  bool free_file;   /* TRUE <=> this->file is "owned" by this quick select */
300
301
  /* Range pointers to be used when not using MRR interface */
302
  QUICK_RANGE **cur_range;  /* current element in ranges  */
303
  QUICK_RANGE *last_range;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
304
1 by brian
clean slate
305
  /* Members needed to use the MRR interface */
306
  QUICK_RANGE_SEQ_CTX qr_traversal_ctx;
307
public:
482 by Brian Aker
Remove uint.
308
  uint32_t mrr_flags; /* Flags to be used with MRR interface */
1 by brian
clean slate
309
protected:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
310
  uint32_t mrr_buf_size; /* copy from session->variables.read_rnd_buff_size */
1 by brian
clean slate
311
  HANDLER_BUFFER *mrr_buf_desc; /* the handler buffer */
312
313
  /* Info about index we're scanning */
314
  KEY_PART *key_parts;
315
  KEY_PART_INFO *key_part_info;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
316
1 by brian
clean slate
317
  bool dont_free; /* Used by QUICK_SELECT_DESC */
318
319
  int cmp_next(QUICK_RANGE *range);
320
  int cmp_prev(QUICK_RANGE *range);
321
  bool row_in_ranges();
322
public:
323
  MEM_ROOT alloc;
324
520.1.22 by Brian Aker
Second pass of thd cleanup
325
  QUICK_RANGE_SELECT(Session *session, Table *table,uint32_t index_arg,bool no_alloc,
1005.2.3 by Monty Taylor
Further reversion of P.
326
                     MEM_ROOT *parent_alloc, bool *create_err);
1 by brian
clean slate
327
  ~QUICK_RANGE_SELECT();
328
329
  int init();
330
  int reset(void);
331
  int get_next();
332
  void range_end();
482 by Brian Aker
Remove uint.
333
  int get_next_prefix(uint32_t prefix_length, key_part_map keypart_map,
481 by Brian Aker
Remove all of uchar.
334
                      unsigned char *cur_prefix);
1 by brian
clean slate
335
  bool reverse_sorted() { return 0; }
336
  bool unique_key_range();
337
  int init_ror_merged_scan(bool reuse_handler);
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
338
  void save_last_pos();
1 by brian
clean slate
339
  int get_type() { return QS_TYPE_RANGE; }
340
  void add_keys_and_lengths(String *key_names, String *used_lengths);
341
  void add_info_string(String *str);
342
private:
343
  /* Used only by QUICK_SELECT_DESC */
344
  QUICK_RANGE_SELECT(const QUICK_RANGE_SELECT& org) : QUICK_SELECT_I()
345
  {
212.6.3 by Mats Kindahl
Removing deprecated functions from code and replacing them with C99 equivalents:
346
    memmove(this, &org, sizeof(*this));
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
347
    /*
1 by brian
clean slate
348
      Use default MRR implementation for reverse scans. No table engine
349
      currently can do an MRR scan with output in reverse index order.
350
    */
351
    mrr_buf_desc= NULL;
352
    mrr_flags |= HA_MRR_USE_DEFAULT_IMPL;
353
    mrr_buf_size= 0;
354
  }
355
  friend class TRP_ROR_INTERSECT;
356
  friend
520.1.22 by Brian Aker
Second pass of thd cleanup
357
  QUICK_RANGE_SELECT *get_quick_select_for_ref(Session *session, Table *table,
1 by brian
clean slate
358
                                               struct st_table_ref *ref,
359
                                               ha_rows records);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
360
  friend bool get_quick_keys(PARAM *param, QUICK_RANGE_SELECT *quick,
361
                             KEY_PART *key, SEL_ARG *key_tree,
482 by Brian Aker
Remove uint.
362
                             unsigned char *min_key, uint32_t min_key_flag,
363
                             unsigned char *max_key, uint32_t max_key_flag);
364
  friend QUICK_RANGE_SELECT *get_quick_select(PARAM*,uint32_t idx,
1 by brian
clean slate
365
                                              SEL_ARG *key_tree,
482 by Brian Aker
Remove uint.
366
                                              uint32_t mrr_flags,
367
                                              uint32_t mrr_buf_size,
1 by brian
clean slate
368
                                              MEM_ROOT *alloc);
369
  friend class QUICK_SELECT_DESC;
370
  friend class QUICK_INDEX_MERGE_SELECT;
371
  friend class QUICK_ROR_INTERSECT_SELECT;
372
  friend class QUICK_GROUP_MIN_MAX_SELECT;
482 by Brian Aker
Remove uint.
373
  friend uint32_t quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
1 by brian
clean slate
374
  friend range_seq_t quick_range_seq_init(void *init_param,
482 by Brian Aker
Remove uint.
375
                                          uint32_t n_ranges, uint32_t flags);
1 by brian
clean slate
376
  friend void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
377
                              bool distinct,const char *message);
378
};
379
380
381
/*
382
  QUICK_INDEX_MERGE_SELECT - index_merge access method quick select.
383
384
    QUICK_INDEX_MERGE_SELECT uses
385
     * QUICK_RANGE_SELECTs to get rows
386
     * Unique class to remove duplicate rows
387
388
  INDEX MERGE OPTIMIZER
389
    Current implementation doesn't detect all cases where index_merge could
390
    be used, in particular:
391
     * index_merge will never be used if range scan is possible (even if
392
       range scan is more expensive)
393
394
     * index_merge+'using index' is not supported (this the consequence of
395
       the above restriction)
396
397
     * If WHERE part contains complex nested AND and OR conditions, some ways
398
       to retrieve rows using index_merge will not be considered. The choice
399
       of read plan may depend on the order of conjuncts/disjuncts in WHERE
400
       part of the query, see comments near imerge_list_or_list and
401
       SEL_IMERGE::or_sel_tree_with_checks functions for details.
402
403
     * There is no "index_merge_ref" method (but index_merge on non-first
404
       table in join is possible with 'range checked for each record').
405
406
    See comments around SEL_IMERGE class and test_quick_select for more
407
    details.
408
409
  ROW RETRIEVAL ALGORITHM
410
411
    index_merge uses Unique class for duplicates removal.  index_merge takes
412
    advantage of Clustered Primary Key (CPK) if the table has one.
413
    The index_merge algorithm consists of two phases:
414
415
    Phase 1 (implemented in QUICK_INDEX_MERGE_SELECT::prepare_unique):
416
    prepare()
417
    {
418
      activate 'index only';
419
      while(retrieve next row for non-CPK scan)
420
      {
421
        if (there is a CPK scan and row will be retrieved by it)
422
          skip this row;
423
        else
424
          put its rowid into Unique;
425
      }
426
      deactivate 'index only';
427
    }
428
429
    Phase 2 (implemented as sequence of QUICK_INDEX_MERGE_SELECT::get_next
430
    calls):
431
432
    fetch()
433
    {
434
      retrieve all rows from row pointers stored in Unique;
435
      free Unique;
436
      retrieve all rows for CPK scan;
437
    }
438
*/
439
440
class QUICK_INDEX_MERGE_SELECT : public QUICK_SELECT_I
441
{
442
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
443
  QUICK_INDEX_MERGE_SELECT(Session *session, Table *table);
1 by brian
clean slate
444
  ~QUICK_INDEX_MERGE_SELECT();
445
446
  int  init();
447
  int  reset(void);
448
  int  get_next();
449
  bool reverse_sorted() { return false; }
450
  bool unique_key_range() { return false; }
451
  int get_type() { return QS_TYPE_INDEX_MERGE; }
452
  void add_keys_and_lengths(String *key_names, String *used_lengths);
453
  void add_info_string(String *str);
1005.2.3 by Monty Taylor
Further reversion of P.
454
  bool is_keys_used(const MY_BITMAP *fields);
1 by brian
clean slate
455
456
  bool push_quick_back(QUICK_RANGE_SELECT *quick_sel_range);
457
458
  /* range quick selects this index_merge read consists of */
459
  List<QUICK_RANGE_SELECT> quick_selects;
460
461
  /* quick select that uses clustered primary key (NULL if none) */
462
  QUICK_RANGE_SELECT* pk_quick_select;
463
464
  /* true if this select is currently doing a clustered PK scan */
465
  bool  doing_pk_scan;
466
467
  MEM_ROOT alloc;
520.1.22 by Brian Aker
Second pass of thd cleanup
468
  Session *session;
1 by brian
clean slate
469
  int read_keys_and_merge();
470
471
  /* used to get rows collected in Unique */
472
  READ_RECORD read_record;
473
};
474
475
476
/*
477
  Rowid-Ordered Retrieval (ROR) index intersection quick select.
478
  This quick select produces intersection of row sequences returned
479
  by several QUICK_RANGE_SELECTs it "merges".
480
481
  All merged QUICK_RANGE_SELECTs must return rowids in rowid order.
482
  QUICK_ROR_INTERSECT_SELECT will return rows in rowid order, too.
483
484
  All merged quick selects retrieve {rowid, covered_fields} tuples (not full
485
  table records).
486
  QUICK_ROR_INTERSECT_SELECT retrieves full records if it is not being used
487
  by QUICK_ROR_INTERSECT_SELECT and all merged quick selects together don't
488
  cover needed all fields.
489
490
  If one of the merged quick selects is a Clustered PK range scan, it is
491
  used only to filter rowid sequence produced by other merged quick selects.
492
*/
493
494
class QUICK_ROR_INTERSECT_SELECT : public QUICK_SELECT_I
495
{
496
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
497
  QUICK_ROR_INTERSECT_SELECT(Session *session, Table *table,
1 by brian
clean slate
498
                             bool retrieve_full_rows,
499
                             MEM_ROOT *parent_alloc);
500
  ~QUICK_ROR_INTERSECT_SELECT();
501
502
  int  init();
503
  int  reset(void);
504
  int  get_next();
505
  bool reverse_sorted() { return false; }
506
  bool unique_key_range() { return false; }
507
  int get_type() { return QS_TYPE_ROR_INTERSECT; }
508
  void add_keys_and_lengths(String *key_names, String *used_lengths);
509
  void add_info_string(String *str);
1005.2.3 by Monty Taylor
Further reversion of P.
510
  bool is_keys_used(const MY_BITMAP *fields);
1 by brian
clean slate
511
  int init_ror_merged_scan(bool reuse_handler);
512
  bool push_quick_back(QUICK_RANGE_SELECT *quick_sel_range);
513
514
  /*
515
    Range quick selects this intersection consists of, not including
516
    cpk_quick.
517
  */
518
  List<QUICK_RANGE_SELECT> quick_selects;
519
520
  /*
521
    Merged quick select that uses Clustered PK, if there is one. This quick
522
    select is not used for row retrieval, it is used for row retrieval.
523
  */
524
  QUICK_RANGE_SELECT *cpk_quick;
525
526
  MEM_ROOT alloc; /* Memory pool for this and merged quick selects data. */
520.1.22 by Brian Aker
Second pass of thd cleanup
527
  Session *session;       /* current thread */
1 by brian
clean slate
528
  bool need_to_fetch_row; /* if true, do retrieve full table records. */
529
  /* in top-level quick select, true if merged scans where initialized */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
530
  bool scans_inited;
1 by brian
clean slate
531
};
532
957.1.4 by Padraig O'Sullivan
Moving my function object to the header file.
533
957.1.6 by Padraig O'Sullivan
Fixed function object to ensure it correctly returns a boolean type since
534
/*
535
 * This function object is defined in drizzled/opt_range.cc
536
 * We need this here for the priority_queue definition in the
537
 * QUICK_ROR_UNION_SELECT class.
538
 */
539
class compare_functor;
540
1 by brian
clean slate
541
542
/*
543
  Rowid-Ordered Retrieval index union select.
544
  This quick select produces union of row sequences returned by several
545
  quick select it "merges".
546
547
  All merged quick selects must return rowids in rowid order.
548
  QUICK_ROR_UNION_SELECT will return rows in rowid order, too.
549
550
  All merged quick selects are set not to retrieve full table records.
551
  ROR-union quick select always retrieves full records.
552
553
*/
554
555
class QUICK_ROR_UNION_SELECT : public QUICK_SELECT_I
556
{
557
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
558
  QUICK_ROR_UNION_SELECT(Session *session, Table *table);
1 by brian
clean slate
559
  ~QUICK_ROR_UNION_SELECT();
560
561
  int  init();
562
  int  reset(void);
563
  int  get_next();
564
  bool reverse_sorted() { return false; }
565
  bool unique_key_range() { return false; }
566
  int get_type() { return QS_TYPE_ROR_UNION; }
567
  void add_keys_and_lengths(String *key_names, String *used_lengths);
568
  void add_info_string(String *str);
1005.2.3 by Monty Taylor
Further reversion of P.
569
  bool is_keys_used(const MY_BITMAP *fields);
1 by brian
clean slate
570
571
  bool push_quick_back(QUICK_SELECT_I *quick_sel_range);
572
573
  List<QUICK_SELECT_I> quick_selects; /* Merged quick selects */
574
957.1.6 by Padraig O'Sullivan
Fixed function object to ensure it correctly returns a boolean type since
575
  /* Priority queue for merge operation */
576
  std::priority_queue<QUICK_SELECT_I *, std::vector<QUICK_SELECT_I *>, compare_functor >
577
    *queue;
1 by brian
clean slate
578
  MEM_ROOT alloc; /* Memory pool for this and merged quick selects data. */
579
520.1.22 by Brian Aker
Second pass of thd cleanup
580
  Session *session;             /* current thread */
481 by Brian Aker
Remove all of uchar.
581
  unsigned char *cur_rowid;      /* buffer used in get_next() */
582
  unsigned char *prev_rowid;     /* rowid of last row returned by get_next() */
1 by brian
clean slate
583
  bool have_prev_rowid; /* true if prev_rowid has valid data */
482 by Brian Aker
Remove uint.
584
  uint32_t rowid_length;    /* table rowid length */
1 by brian
clean slate
585
private:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
586
  bool scans_inited;
1 by brian
clean slate
587
};
588
589
/*
590
  Index scan for GROUP-BY queries with MIN/MAX aggregate functions.
591
592
  This class provides a specialized index access method for GROUP-BY queries
593
  of the forms:
594
595
       SELECT A_1,...,A_k, [B_1,...,B_m], [MIN(C)], [MAX(C)]
596
         FROM T
597
        WHERE [RNG(A_1,...,A_p ; where p <= k)]
598
         [AND EQ(B_1,...,B_m)]
599
         [AND PC(C)]
600
         [AND PA(A_i1,...,A_iq)]
601
       GROUP BY A_1,...,A_k;
602
603
    or
604
605
       SELECT DISTINCT A_i1,...,A_ik
606
         FROM T
607
        WHERE [RNG(A_1,...,A_p ; where p <= k)]
608
         [AND PA(A_i1,...,A_iq)];
609
610
  where all selected fields are parts of the same index.
611
  The class of queries that can be processed by this quick select is fully
612
  specified in the description of get_best_trp_group_min_max() in opt_range.cc.
613
614
  The get_next() method directly produces result tuples, thus obviating the
615
  need to call end_send_group() because all grouping is already done inside
616
  get_next().
617
618
  Since one of the requirements is that all select fields are part of the same
619
  index, this class produces only index keys, and not complete records.
620
*/
621
622
class QUICK_GROUP_MIN_MAX_SELECT : public QUICK_SELECT_I
623
{
624
private:
625
  handler *file;         /* The handler used to get data. */
626
  JOIN *join;            /* Descriptor of the current query */
627
  KEY  *index_info;      /* The index chosen for data access */
481 by Brian Aker
Remove all of uchar.
628
  unsigned char *record;          /* Buffer where the next record is returned. */
629
  unsigned char *tmp_record;      /* Temporary storage for next_min(), next_max(). */
630
  unsigned char *group_prefix;    /* Key prefix consisting of the GROUP fields. */
482 by Brian Aker
Remove uint.
631
  uint32_t group_prefix_len; /* Length of the group prefix. */
632
  uint32_t group_key_parts;  /* A number of keyparts in the group prefix */
481 by Brian Aker
Remove all of uchar.
633
  unsigned char *last_prefix;     /* Prefix of the last group for detecting EOF. */
1 by brian
clean slate
634
  bool have_min;         /* Specify whether we are computing */
635
  bool have_max;         /*   a MIN, a MAX, or both.         */
636
  bool seen_first_key;   /* Denotes whether the first key was retrieved.*/
637
  KEY_PART_INFO *min_max_arg_part; /* The keypart of the only argument field */
638
                                   /* of all MIN/MAX functions.              */
482 by Brian Aker
Remove uint.
639
  uint32_t min_max_arg_len;  /* The length of the MIN/MAX argument field */
481 by Brian Aker
Remove all of uchar.
640
  unsigned char *key_infix;       /* Infix of constants from equality predicates. */
482 by Brian Aker
Remove uint.
641
  uint32_t key_infix_len;
1 by brian
clean slate
642
  DYNAMIC_ARRAY min_max_ranges; /* Array of range ptrs for the MIN/MAX field. */
482 by Brian Aker
Remove uint.
643
  uint32_t real_prefix_len; /* Length of key prefix extended with key_infix. */
644
  uint32_t real_key_parts;  /* A number of keyparts in the above value.      */
1 by brian
clean slate
645
  List<Item_sum> *min_functions;
646
  List<Item_sum> *max_functions;
647
  List_iterator<Item_sum> *min_functions_it;
648
  List_iterator<Item_sum> *max_functions_it;
649
public:
650
  /*
651
    The following two members are public to allow easy access from
652
    TRP_GROUP_MIN_MAX::make_quick()
653
  */
654
  MEM_ROOT alloc; /* Memory pool for this and quick_prefix_select data. */
655
  QUICK_RANGE_SELECT *quick_prefix_select;/* For retrieval of group prefixes. */
656
private:
657
  int  next_prefix();
658
  int  next_min_in_range();
659
  int  next_max_in_range();
660
  int  next_min();
661
  int  next_max();
662
  void update_min_result();
663
  void update_max_result();
664
public:
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
665
  QUICK_GROUP_MIN_MAX_SELECT(Table *table, JOIN *join, bool have_min,
1 by brian
clean slate
666
                             bool have_max, KEY_PART_INFO *min_max_arg_part,
482 by Brian Aker
Remove uint.
667
                             uint32_t group_prefix_len, uint32_t group_key_parts,
668
                             uint32_t used_key_parts, KEY *index_info, uint
1 by brian
clean slate
669
                             use_index, double read_cost, ha_rows records, uint
481 by Brian Aker
Remove all of uchar.
670
                             key_infix_len, unsigned char *key_infix, MEM_ROOT
1 by brian
clean slate
671
                             *parent_alloc);
672
  ~QUICK_GROUP_MIN_MAX_SELECT();
673
  bool add_range(SEL_ARG *sel_range);
674
  void update_key_stat();
675
  void adjust_prefix_ranges();
676
  bool alloc_buffers();
677
  int init();
678
  int reset();
679
  int get_next();
680
  bool reverse_sorted() { return false; }
681
  bool unique_key_range() { return false; }
682
  int get_type() { return QS_TYPE_GROUP_MIN_MAX; }
683
  void add_keys_and_lengths(String *key_names, String *used_lengths);
684
};
685
686
687
class QUICK_SELECT_DESC: public QUICK_RANGE_SELECT
688
{
689
public:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
690
  QUICK_SELECT_DESC(QUICK_RANGE_SELECT *q, uint32_t used_key_parts,
1 by brian
clean slate
691
                    bool *create_err);
692
  int get_next();
693
  bool reverse_sorted() { return 1; }
694
  int get_type() { return QS_TYPE_RANGE_DESC; }
695
private:
696
  bool range_reads_after_key(QUICK_RANGE *range);
697
  int reset(void) { rev_it.rewind(); return QUICK_RANGE_SELECT::reset(); }
698
  List<QUICK_RANGE> rev_ranges;
699
  List_iterator<QUICK_RANGE> rev_it;
700
};
701
702
703
class SQL_SELECT :public Sql_alloc {
704
 public:
705
  QUICK_SELECT_I *quick;	// If quick-select used
706
  COND		*cond;		// where condition
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
707
  Table	*head;
1 by brian
clean slate
708
  IO_CACHE file;		// Positions to used records
709
  ha_rows records;		// Records in use if read from file
710
  double read_time;		// Time to read rows
711
  key_map quick_keys;		// Possible quick keys
712
  key_map needed_reg;		// Possible quick keys after prev tables.
713
  table_map const_tables,read_tables;
714
  bool	free_cond;
715
716
  SQL_SELECT();
717
  ~SQL_SELECT();
718
  void cleanup();
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
719
  bool check_quick(Session *session, bool force_quick_range, ha_rows limit);
720
  bool skip_record();
520.1.22 by Brian Aker
Second pass of thd cleanup
721
  int test_quick_select(Session *session, key_map keys, table_map prev_tables,
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
722
                        ha_rows limit, bool force_quick_range,
1 by brian
clean slate
723
                        bool ordered_output);
724
};
725
520.1.22 by Brian Aker
Second pass of thd cleanup
726
QUICK_RANGE_SELECT *get_quick_select_for_ref(Session *session, Table *table,
1 by brian
clean slate
727
                                             struct st_table_ref *ref,
728
                                             ha_rows records);
482 by Brian Aker
Remove uint.
729
uint32_t get_index_for_order(Table *table, order_st *order, ha_rows limit);
1 by brian
clean slate
730
731
#endif