1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008-2009 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
20
#ifndef DRIZZLED_OPTIMIZER_TABLE_READ_PLAN_H
21
#define DRIZZLED_OPTIMIZER_TABLE_READ_PLAN_H
24
struct st_ror_scan_info;
36
Table rows retrieval plan. Range optimizer creates QuickSelectInterface-derived
37
objects from table read plans.
43
Plan read cost, with or without cost of full row retrieval, depending
44
on plan creation parameters.
47
ha_rows records; /* estimate of #rows to be examined */
50
If true, the scan returns rows in rowid order. This is used only for
51
scans that can be both ROR and non-ROR.
56
Create quick select for this plan.
59
param Parameter from test_quick_select
60
retrieve_full_rows If true, created quick select will do full record
62
parent_alloc Memory pool to use, if any.
65
retrieve_full_rows is ignored by some implementations.
71
virtual QuickSelectInterface *make_quick(Parameter *param,
72
bool retrieve_full_rows,
73
MEM_ROOT *parent_alloc= NULL) = 0;
75
/* Table read plans are allocated on MEM_ROOT and are never deleted */
76
static void *operator new(size_t size, MEM_ROOT *mem_root)
78
return (void*) alloc_root(mem_root, (uint32_t) size);
81
static void operator delete(void *, size_t)
86
static void operator delete(void *, MEM_ROOT *)
87
{ /* Never called */ }
89
virtual ~TABLE_READ_PLAN() {} /* Remove gcc warning */
95
Plan for a QuickRangeSelect scan.
96
TRP_RANGE::make_quick ignores retrieve_full_rows parameter because
97
QuickRangeSelect doesn't distinguish between 'index only' scans and full
98
record retrieval scans.
100
class TRP_RANGE : public TABLE_READ_PLAN
105
SEL_ARG *key; /* set of intervals to be used in "range" method retrieval */
106
uint32_t key_idx; /* key number in Parameter::key */
108
uint32_t mrr_buf_size;
110
TRP_RANGE(SEL_ARG *key_arg, uint32_t idx_arg, uint32_t mrr_flags_arg)
114
mrr_flags(mrr_flags_arg)
116
virtual ~TRP_RANGE() {} /* Remove gcc warning */
118
QuickSelectInterface *make_quick(Parameter *param, bool, MEM_ROOT *parent_alloc);
123
/* Plan for QuickRorIntersectSelect scan. */
125
class TRP_ROR_INTERSECT : public TABLE_READ_PLAN
128
TRP_ROR_INTERSECT() {} /* Remove gcc warning */
129
virtual ~TRP_ROR_INTERSECT() {} /* Remove gcc warning */
130
QuickSelectInterface *make_quick(Parameter *param,
131
bool retrieve_full_rows,
132
MEM_ROOT *parent_alloc);
134
/* Array of pointers to ROR range scans used in this intersection */
135
struct st_ror_scan_info **first_scan;
136
struct st_ror_scan_info **last_scan; /* End of the above array */
137
struct st_ror_scan_info *cpk_scan; /* Clustered PK scan, if there is one */
138
bool is_covering; /* true if no row retrieval phase is necessary */
139
double index_scan_costs; /* SUM(cost(index_scan)) */
144
Plan for QuickRorUnionSelect scan.
145
QuickRorUnionSelect always retrieves full rows, so retrieve_full_rows
146
is ignored by make_quick.
149
class TRP_ROR_UNION : public TABLE_READ_PLAN
152
TRP_ROR_UNION() {} /* Remove gcc warning */
153
virtual ~TRP_ROR_UNION() {} /* Remove gcc warning */
154
QuickSelectInterface *make_quick(Parameter *param,
155
bool retrieve_full_rows,
156
MEM_ROOT *parent_alloc);
157
TABLE_READ_PLAN **first_ror; /* array of ptrs to plans for merged scans */
158
TABLE_READ_PLAN **last_ror; /* end of the above array */
163
Plan for QuickIndexMergeSelect scan.
164
QuickRorIntersectSelect always retrieves full rows, so retrieve_full_rows
165
is ignored by make_quick.
168
class TRP_INDEX_MERGE : public TABLE_READ_PLAN
171
TRP_INDEX_MERGE() {} /* Remove gcc warning */
172
virtual ~TRP_INDEX_MERGE() {} /* Remove gcc warning */
173
QuickSelectInterface *make_quick(Parameter *param,
174
bool retrieve_full_rows,
175
MEM_ROOT *parent_alloc);
176
TRP_RANGE **range_scans; /* array of ptrs to plans of merged scans */
177
TRP_RANGE **range_scans_end; /* end of the array */
182
Plan for a QuickGroupMinMaxSelect scan.
185
class TRP_GROUP_MIN_MAX : public TABLE_READ_PLAN
190
KEY_PART_INFO *min_max_arg_part;
191
uint32_t group_prefix_len;
192
uint32_t used_key_parts;
193
uint32_t group_key_parts;
196
uint32_t key_infix_len;
197
unsigned char key_infix[MAX_KEY_LENGTH];
198
SEL_TREE *range_tree; /* Represents all range predicates in the query. */
199
SEL_ARG *index_tree; /* The SEL_ARG sub-tree corresponding to index_info. */
200
uint32_t param_idx; /* Index of used key in param->key. */
201
/* Number of records selected by the ranges in index_tree. */
203
ha_rows quick_prefix_records;
206
TRP_GROUP_MIN_MAX(bool have_min_arg,
208
KEY_PART_INFO *min_max_arg_part_arg,
209
uint32_t group_prefix_len_arg,
210
uint32_t used_key_parts_arg,
211
uint32_t group_key_parts_arg,
214
uint32_t key_infix_len_arg,
215
unsigned char *key_infix_arg,
217
SEL_ARG *index_tree_arg,
218
uint32_t param_idx_arg,
219
ha_rows quick_prefix_records_arg)
221
have_min(have_min_arg),
222
have_max(have_max_arg),
223
min_max_arg_part(min_max_arg_part_arg),
224
group_prefix_len(group_prefix_len_arg),
225
used_key_parts(used_key_parts_arg),
226
group_key_parts(group_key_parts_arg),
227
index_info(index_info_arg),
229
key_infix_len(key_infix_len_arg),
230
range_tree(tree_arg),
231
index_tree(index_tree_arg),
232
param_idx(param_idx_arg),
233
quick_prefix_records(quick_prefix_records_arg)
236
memcpy(this->key_infix, key_infix_arg, key_infix_len);
238
virtual ~TRP_GROUP_MIN_MAX() {} /* Remove gcc warning */
240
QuickSelectInterface *make_quick(Parameter *param,
241
bool retrieve_full_rows,
242
MEM_ROOT *parent_alloc);
246
} /* namespace optimizer */
248
} /* namespace drizzled */
250
#endif /* DRIZZLED_OPTIMIZER_TABLE_READ_PLAN_H */