00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #pragma once
00021
00022 #include <drizzled/memory/sql_alloc.h>
00023 #include <drizzled/util/functors.h>
00024 #include <algorithm>
00025
00026 namespace drizzled {
00027 namespace optimizer {
00028
00029
00030
00031
00032
00033 class TableReadPlan : public memory::SqlAlloc
00034 {
00035 public:
00036
00037
00038
00039
00040 double read_cost;
00041 ha_rows records;
00042
00043
00044
00045
00046
00047 bool is_ror;
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 virtual QuickSelectInterface *make_quick(Parameter *param,
00066 bool retrieve_full_rows,
00067 memory::Root *parent_alloc= NULL) = 0;
00068
00069 virtual ~TableReadPlan() {}
00070 };
00071
00072
00073
00074
00075
00076
00077
00078
00079 class RangeReadPlan : public TableReadPlan
00080 {
00081 public:
00082 SEL_ARG *key;
00083 uint32_t key_idx;
00084 uint32_t mrr_flags;
00085 uint32_t mrr_buf_size;
00086
00087 RangeReadPlan(SEL_ARG *key_arg, uint32_t idx_arg, uint32_t mrr_flags_arg)
00088 :
00089 key(key_arg),
00090 key_idx(idx_arg),
00091 mrr_flags(mrr_flags_arg)
00092 {}
00093
00094 QuickSelectInterface *make_quick(Parameter *param, bool, memory::Root *parent_alloc);
00095 };
00096
00097
00098
00099 class RorIntersectReadPlan : public TableReadPlan
00100 {
00101 public:
00102 QuickSelectInterface *make_quick(Parameter *param,
00103 bool retrieve_full_rows,
00104 memory::Root *parent_alloc);
00105
00106
00107 RorScanInfo **first_scan;
00108 RorScanInfo **last_scan;
00109 RorScanInfo *cpk_scan;
00110
00111 bool is_covering;
00112 double index_scan_costs;
00113
00114 };
00115
00116
00117
00118
00119
00120
00121
00122
00123 class RorUnionReadPlan : public TableReadPlan
00124 {
00125 public:
00126 QuickSelectInterface *make_quick(Parameter *param,
00127 bool retrieve_full_rows,
00128 memory::Root *parent_alloc);
00129 TableReadPlan **first_ror;
00130 TableReadPlan **last_ror;
00131 };
00132
00133
00134
00135
00136
00137
00138
00139
00140 class IndexMergeReadPlan : public TableReadPlan
00141 {
00142 public:
00143 QuickSelectInterface *make_quick(Parameter *param,
00144 bool retrieve_full_rows,
00145 memory::Root *parent_alloc);
00146 RangeReadPlan **range_scans;
00147 RangeReadPlan **range_scans_end;
00148 };
00149
00150
00151
00152
00153
00154
00155 class GroupMinMaxReadPlan : public TableReadPlan
00156 {
00157 private:
00158 bool have_min;
00159 bool have_max;
00160 KeyPartInfo *min_max_arg_part;
00161 uint32_t group_prefix_len;
00162 uint32_t used_key_parts;
00163 uint32_t group_key_parts;
00164 KeyInfo *index_info;
00165 uint32_t index;
00166 uint32_t key_infix_len;
00167 unsigned char key_infix[MAX_KEY_LENGTH];
00168 SEL_TREE *range_tree;
00169 SEL_ARG *index_tree;
00170 uint32_t param_idx;
00171
00172 public:
00173 ha_rows quick_prefix_records;
00174
00175 public:
00176 GroupMinMaxReadPlan(bool have_min_arg,
00177 bool have_max_arg,
00178 KeyPartInfo *min_max_arg_part_arg,
00179 uint32_t group_prefix_len_arg,
00180 uint32_t used_key_parts_arg,
00181 uint32_t group_key_parts_arg,
00182 KeyInfo *index_info_arg,
00183 uint32_t index_arg,
00184 uint32_t key_infix_len_arg,
00185 unsigned char *key_infix_arg,
00186 SEL_TREE *tree_arg,
00187 SEL_ARG *index_tree_arg,
00188 uint32_t param_idx_arg,
00189 ha_rows quick_prefix_records_arg)
00190 :
00191 have_min(have_min_arg),
00192 have_max(have_max_arg),
00193 min_max_arg_part(min_max_arg_part_arg),
00194 group_prefix_len(group_prefix_len_arg),
00195 used_key_parts(used_key_parts_arg),
00196 group_key_parts(group_key_parts_arg),
00197 index_info(index_info_arg),
00198 index(index_arg),
00199 key_infix_len(key_infix_len_arg),
00200 range_tree(tree_arg),
00201 index_tree(index_tree_arg),
00202 param_idx(param_idx_arg),
00203 quick_prefix_records(quick_prefix_records_arg)
00204 {
00205 if (key_infix_len)
00206 memcpy(this->key_infix, key_infix_arg, key_infix_len);
00207 }
00208
00209 QuickSelectInterface *make_quick(Parameter *param,
00210 bool retrieve_full_rows,
00211 memory::Root *parent_alloc);
00212 };
00213
00214
00215 }
00216
00217 }
00218