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 <boost/dynamic_bitset.hpp>
00023
00024 #include <drizzled/field.h>
00025
00026 namespace drizzled
00027 {
00028
00029 typedef class Item COND;
00030 typedef struct st_key_part KEY_PART;
00031
00032 namespace optimizer
00033 {
00034
00035 class RorScanInfo
00036 {
00037 public:
00038 RorScanInfo()
00039 :
00040 idx(0),
00041 keynr(0),
00042 records(0),
00043 sel_arg(NULL),
00044 covered_fields(0),
00045 covered_fields_size(0),
00046 used_fields_covered(0),
00047 key_rec_length(0),
00048 index_read_cost(0.0),
00049 first_uncovered_field(0),
00050 key_components(0)
00051 {}
00052
00053 boost::dynamic_bitset<> bitsToBitset() const;
00054
00055 void subtractBitset(const boost::dynamic_bitset<>& in_bitset);
00056
00057 uint32_t findFirstNotSet() const;
00058
00059 size_t getBitCount() const;
00060
00061 uint32_t idx;
00062 uint32_t keynr;
00063 ha_rows records;
00064
00065
00066 optimizer::SEL_ARG *sel_arg;
00067
00068
00069 uint64_t covered_fields;
00070 size_t covered_fields_size;
00071 uint32_t used_fields_covered;
00072 int key_rec_length;
00073
00074
00075
00076
00077
00078 double index_read_cost;
00079 uint32_t first_uncovered_field;
00080 uint32_t key_components;
00081 };
00082
00083 class RangeParameter
00084 {
00085 public:
00086
00087 RangeParameter()
00088 :
00089 session(NULL),
00090 table(NULL),
00091 cond(NULL),
00092 prev_tables(),
00093 read_tables(),
00094 current_table(),
00095 key_parts(NULL),
00096 key_parts_end(NULL),
00097 mem_root(NULL),
00098 old_root(NULL),
00099 keys(0),
00100 using_real_indexes(false),
00101 remove_jump_scans(false),
00102 alloced_sel_args(0),
00103 force_default_mrr(false)
00104 {}
00105
00106 Session *session;
00107 Table *table;
00108 COND *cond;
00109 table_map prev_tables;
00110 table_map read_tables;
00111 table_map current_table;
00112
00113
00114 KEY_PART *key_parts;
00115 KEY_PART *key_parts_end;
00116 memory::Root *mem_root;
00117 memory::Root *old_root;
00118
00119
00120
00121
00122 uint32_t keys;
00123
00124
00125
00126
00127
00128
00129 bool using_real_indexes;
00130
00131 bool remove_jump_scans;
00132
00133
00134
00135
00136
00137 uint32_t real_keynr[MAX_KEY];
00138
00139 uint32_t alloced_sel_args;
00140 bool force_default_mrr;
00141 };
00142
00143 class Parameter : public RangeParameter
00144 {
00145 public:
00146
00147 Parameter()
00148 :
00149 RangeParameter(),
00150 max_key_part(0),
00151 range_count(0),
00152 quick(false),
00153 needed_fields(),
00154 tmp_covered_fields(),
00155 needed_reg(NULL),
00156 imerge_cost_buff(NULL),
00157 imerge_cost_buff_size(0),
00158 is_ror_scan(false),
00159 n_ranges(0)
00160 {}
00161
00162 KEY_PART *key[MAX_KEY];
00163 uint32_t max_key_part;
00164
00165 uint32_t range_count;
00166 unsigned char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
00167 unsigned char max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
00168 bool quick;
00169
00170 boost::dynamic_bitset<> needed_fields;
00171 boost::dynamic_bitset<> tmp_covered_fields;
00172
00173 key_map *needed_reg;
00174
00175 uint32_t *imerge_cost_buff;
00176 uint32_t imerge_cost_buff_size;
00177
00178
00179 bool is_ror_scan;
00180
00181 uint32_t n_ranges;
00182 };
00183
00184 }
00185
00186 }
00187