1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
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.
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.
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
17
21
/* classes to use when handling where clause */
23
#ifndef DRIZZLED_OPT_RANGE_H
24
#define DRIZZLED_OPT_RANGE_H
22
#ifdef USE_PRAGMA_INTERFACE
23
#pragma interface /* gcc class implementation */
26
27
typedef struct st_key_part {
41
42
class QUICK_RANGE :public Sql_alloc {
43
uchar *min_key,*max_key;
44
unsigned char *min_key,*max_key;
44
45
uint16_t min_length,max_length,flag;
45
46
key_part_map min_keypart_map, // bitmap of used keyparts in min_key
46
47
max_keypart_map; // bitmap of used keyparts in max_key
48
49
uint16_t dummy; /* Avoid warnings on 'flag' */
50
51
QUICK_RANGE(); /* Full range */
51
QUICK_RANGE(const uchar *min_key_arg, uint min_length_arg,
52
QUICK_RANGE(const unsigned char *min_key_arg, uint32_t min_length_arg,
52
53
key_part_map min_keypart_map_arg,
53
const uchar *max_key_arg, uint max_length_arg,
54
const unsigned char *max_key_arg, uint32_t max_length_arg,
54
55
key_part_map max_keypart_map_arg,
56
: min_key((uchar*) sql_memdup(min_key_arg,min_length_arg+1)),
57
max_key((uchar*) sql_memdup(max_key_arg,max_length_arg+1)),
57
: min_key((unsigned char*) sql_memdup(min_key_arg,min_length_arg+1)),
58
max_key((unsigned char*) sql_memdup(max_key_arg,max_length_arg+1)),
58
59
min_length((uint16_t) min_length_arg),
59
60
max_length((uint16_t) max_length_arg),
60
61
flag((uint16_t) flag_arg),
118
119
ha_rows records; /* estimate of # of records to be retrieved */
119
120
double read_time; /* time to perform this retrieval */
122
123
Index this quick select uses, or MAX_KEY for quick selects
123
124
that use several indexes
128
129
Total length of first used_key_parts parts of the key.
129
130
Applicable if index!= MAX_KEY.
131
uint max_used_key_length;
132
uint32_t max_used_key_length;
134
135
Max. number of (first) key parts this quick select uses for retrieval.
270
271
QUICK_RANGE **last;
271
272
} QUICK_RANGE_SEQ_CTX;
273
range_seq_t quick_range_seq_init(void *init_param, uint n_ranges, uint flags);
274
uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
274
range_seq_t quick_range_seq_init(void *init_param, uint32_t n_ranges, uint32_t flags);
275
uint32_t quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
296
297
/* Members needed to use the MRR interface */
297
298
QUICK_RANGE_SEQ_CTX qr_traversal_ctx;
299
uint mrr_flags; /* Flags to be used with MRR interface */
300
uint32_t mrr_flags; /* Flags to be used with MRR interface */
301
uint mrr_buf_size; /* copy from thd->variables.read_rnd_buff_size */
302
uint32_t mrr_buf_size; /* copy from thd->variables.read_rnd_buff_size */
302
303
HANDLER_BUFFER *mrr_buf_desc; /* the handler buffer */
304
305
/* Info about index we're scanning */
316
QUICK_RANGE_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc,
317
QUICK_RANGE_SELECT(THD *thd, Table *table,uint32_t index_arg,bool no_alloc,
317
318
MEM_ROOT *parent_alloc, bool *create_err);
318
319
~QUICK_RANGE_SELECT();
323
324
void range_end();
324
int get_next_prefix(uint prefix_length, key_part_map keypart_map,
325
int get_next_prefix(uint32_t prefix_length, key_part_map keypart_map,
326
unsigned char *cur_prefix);
326
327
bool reverse_sorted() { return 0; }
327
328
bool unique_key_range();
328
329
int init_ror_merged_scan(bool reuse_handler);
347
348
friend class TRP_ROR_INTERSECT;
349
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
350
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, Table *table,
350
351
struct st_table_ref *ref,
351
352
ha_rows records);
352
353
friend bool get_quick_keys(PARAM *param, QUICK_RANGE_SELECT *quick,
353
354
KEY_PART *key, SEL_ARG *key_tree,
354
uchar *min_key, uint min_key_flag,
355
uchar *max_key, uint max_key_flag);
356
friend QUICK_RANGE_SELECT *get_quick_select(PARAM*,uint idx,
355
unsigned char *min_key, uint32_t min_key_flag,
356
unsigned char *max_key, uint32_t max_key_flag);
357
friend QUICK_RANGE_SELECT *get_quick_select(PARAM*,uint32_t idx,
357
358
SEL_ARG *key_tree,
360
uint32_t mrr_buf_size,
360
361
MEM_ROOT *alloc);
361
362
friend class QUICK_SELECT_DESC;
362
363
friend class QUICK_INDEX_MERGE_SELECT;
363
364
friend class QUICK_ROR_INTERSECT_SELECT;
364
365
friend class QUICK_GROUP_MIN_MAX_SELECT;
365
friend uint quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
366
friend uint32_t quick_range_seq_next(range_seq_t rseq, KEY_MULTI_RANGE *range);
366
367
friend range_seq_t quick_range_seq_init(void *init_param,
367
uint n_ranges, uint flags);
368
uint32_t n_ranges, uint32_t flags);
368
369
friend void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
369
370
bool distinct,const char *message);
432
433
class QUICK_INDEX_MERGE_SELECT : public QUICK_SELECT_I
435
QUICK_INDEX_MERGE_SELECT(THD *thd, TABLE *table);
436
QUICK_INDEX_MERGE_SELECT(THD *thd, Table *table);
436
437
~QUICK_INDEX_MERGE_SELECT();
486
487
class QUICK_ROR_INTERSECT_SELECT : public QUICK_SELECT_I
489
QUICK_ROR_INTERSECT_SELECT(THD *thd, TABLE *table,
490
QUICK_ROR_INTERSECT_SELECT(THD *thd, Table *table,
490
491
bool retrieve_full_rows,
491
492
MEM_ROOT *parent_alloc);
492
493
~QUICK_ROR_INTERSECT_SELECT();
539
540
class QUICK_ROR_UNION_SELECT : public QUICK_SELECT_I
542
QUICK_ROR_UNION_SELECT(THD *thd, TABLE *table);
543
QUICK_ROR_UNION_SELECT(THD *thd, Table *table);
543
544
~QUICK_ROR_UNION_SELECT();
560
561
MEM_ROOT alloc; /* Memory pool for this and merged quick selects data. */
562
563
THD *thd; /* current thread */
563
uchar *cur_rowid; /* buffer used in get_next() */
564
uchar *prev_rowid; /* rowid of last row returned by get_next() */
564
unsigned char *cur_rowid; /* buffer used in get_next() */
565
unsigned char *prev_rowid; /* rowid of last row returned by get_next() */
565
566
bool have_prev_rowid; /* true if prev_rowid has valid data */
566
uint rowid_length; /* table rowid length */
567
uint32_t rowid_length; /* table rowid length */
568
static int queue_cmp(void *arg, uchar *val1, uchar *val2);
569
static int queue_cmp(void *arg, unsigned char *val1, unsigned char *val2);
569
570
bool scans_inited;
609
610
handler *file; /* The handler used to get data. */
610
611
JOIN *join; /* Descriptor of the current query */
611
612
KEY *index_info; /* The index chosen for data access */
612
uchar *record; /* Buffer where the next record is returned. */
613
uchar *tmp_record; /* Temporary storage for next_min(), next_max(). */
614
uchar *group_prefix; /* Key prefix consisting of the GROUP fields. */
615
uint group_prefix_len; /* Length of the group prefix. */
616
uint group_key_parts; /* A number of keyparts in the group prefix */
617
uchar *last_prefix; /* Prefix of the last group for detecting EOF. */
613
unsigned char *record; /* Buffer where the next record is returned. */
614
unsigned char *tmp_record; /* Temporary storage for next_min(), next_max(). */
615
unsigned char *group_prefix; /* Key prefix consisting of the GROUP fields. */
616
uint32_t group_prefix_len; /* Length of the group prefix. */
617
uint32_t group_key_parts; /* A number of keyparts in the group prefix */
618
unsigned char *last_prefix; /* Prefix of the last group for detecting EOF. */
618
619
bool have_min; /* Specify whether we are computing */
619
620
bool have_max; /* a MIN, a MAX, or both. */
620
621
bool seen_first_key; /* Denotes whether the first key was retrieved.*/
621
622
KEY_PART_INFO *min_max_arg_part; /* The keypart of the only argument field */
622
623
/* of all MIN/MAX functions. */
623
uint min_max_arg_len; /* The length of the MIN/MAX argument field */
624
uchar *key_infix; /* Infix of constants from equality predicates. */
624
uint32_t min_max_arg_len; /* The length of the MIN/MAX argument field */
625
unsigned char *key_infix; /* Infix of constants from equality predicates. */
626
uint32_t key_infix_len;
626
627
DYNAMIC_ARRAY min_max_ranges; /* Array of range ptrs for the MIN/MAX field. */
627
uint real_prefix_len; /* Length of key prefix extended with key_infix. */
628
uint real_key_parts; /* A number of keyparts in the above value. */
628
uint32_t real_prefix_len; /* Length of key prefix extended with key_infix. */
629
uint32_t real_key_parts; /* A number of keyparts in the above value. */
629
630
List<Item_sum> *min_functions;
630
631
List<Item_sum> *max_functions;
631
632
List_iterator<Item_sum> *min_functions_it;
646
647
void update_min_result();
647
648
void update_max_result();
649
QUICK_GROUP_MIN_MAX_SELECT(TABLE *table, JOIN *join, bool have_min,
650
QUICK_GROUP_MIN_MAX_SELECT(Table *table, JOIN *join, bool have_min,
650
651
bool have_max, KEY_PART_INFO *min_max_arg_part,
651
uint group_prefix_len, uint group_key_parts,
652
uint used_key_parts, KEY *index_info, uint
652
uint32_t group_prefix_len, uint32_t group_key_parts,
653
uint32_t used_key_parts, KEY *index_info, uint
653
654
use_index, double read_cost, ha_rows records, uint
654
key_infix_len, uchar *key_infix, MEM_ROOT
655
key_infix_len, unsigned char *key_infix, MEM_ROOT
656
657
~QUICK_GROUP_MIN_MAX_SELECT();
657
658
bool add_range(SEL_ARG *sel_range);
671
672
class QUICK_SELECT_DESC: public QUICK_RANGE_SELECT
674
QUICK_SELECT_DESC(QUICK_RANGE_SELECT *q, uint used_key_parts,
675
QUICK_SELECT_DESC(QUICK_RANGE_SELECT *q, uint32_t used_key_parts,
675
676
bool *create_err);
677
678
bool reverse_sorted() { return 1; }
680
681
bool range_reads_after_key(QUICK_RANGE *range);
682
bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts);
683
bool test_if_null_range(QUICK_RANGE *range, uint32_t used_key_parts);
684
685
int reset(void) { rev_it.rewind(); return QUICK_RANGE_SELECT::reset(); }
685
686
List<QUICK_RANGE> rev_ranges;
692
693
QUICK_SELECT_I *quick; // If quick-select used
693
694
COND *cond; // where condition
695
696
IO_CACHE file; // Positions to used records
696
697
ha_rows records; // Records in use if read from file
697
698
double read_time; // Time to read rows
715
716
bool ordered_output);
718
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
719
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, Table *table,
719
720
struct st_table_ref *ref,
720
721
ha_rows records);
721
uint get_index_for_order(TABLE *table, ORDER *order, ha_rows limit);
722
uint32_t get_index_for_order(Table *table, order_st *order, ha_rows limit);