21 #include <drizzled/session.h>
22 #include <drizzled/records.h>
23 #include <drizzled/util/functors.h>
24 #include <drizzled/optimizer/quick_range_select.h>
25 #include <drizzled/optimizer/quick_index_merge_select.h>
26 #include <drizzled/internal/m_string.h>
27 #include <drizzled/unique.h>
28 #include <drizzled/key.h>
29 #include <drizzled/table.h>
30 #include <drizzled/system_variables.h>
38 static int refpos_order_cmp(
void *arg,
const void *a,
const void *b)
40 Cursor *cursor= (Cursor*)arg;
41 return cursor->cmp_ref((
const unsigned char *) a, (
const unsigned char *) b);
44 optimizer::QuickIndexMergeSelect::QuickIndexMergeSelect(Session *session_param,
47 pk_quick_select(NULL),
48 session(session_param)
52 memset(&read_record, 0,
sizeof(read_record));
63 return (read_keys_and_merge());
72 if (head->cursor->primary_key_is_clustered() &&
73 quick_sel_range->
index == head->getShare()->getPrimaryKey())
75 pk_quick_select= quick_sel_range;
79 quick_selects.push_back(quick_sel_range);
83 optimizer::QuickIndexMergeSelect::~QuickIndexMergeSelect()
85 BOOST_FOREACH(QuickRangeSelect* it, quick_selects)
87 for_each(quick_selects.begin(), quick_selects.end(), DeletePtr());
88 quick_selects.clear();
89 delete pk_quick_select;
90 alloc.free_root(MYF(0));
96 vector<optimizer::QuickRangeSelect *>::iterator it= quick_selects.begin();
100 Cursor *cursor= head->cursor;
102 cursor->extra(HA_EXTRA_KEYREAD);
103 head->prepare_for_position();
107 assert(cur_quick != 0);
113 if (cur_quick->
init() || cur_quick->
reset())
116 unique=
new Unique(refpos_order_cmp,
124 while ((result= cur_quick->
get_next()) == HA_ERR_END_OF_FILE)
127 if (it == quick_selects.end())
136 if (cur_quick->cursor->inited != Cursor::NONE)
137 cur_quick->cursor->endIndexScan();
138 if (cur_quick->
init() || cur_quick->
reset())
144 if (result != HA_ERR_END_OF_FILE)
152 if (session->getKilled())
156 if (pk_quick_select && pk_quick_select->row_in_ranges())
159 cur_quick->cursor->position(cur_quick->
record);
160 result= unique->unique_add((
char*) cur_quick->cursor->ref);
167 result= unique->get(head);
169 doing_pk_scan=
false;
171 cursor->extra(HA_EXTRA_NO_KEYREAD);
175 head->print_error(result, MYF(0));
187 return(pk_quick_select->get_next());
189 if ((result= read_record.read_record(&read_record)) == -1)
191 result= HA_ERR_END_OF_FILE;
192 read_record.end_read_record();
197 if ((result= pk_quick_select->init()) ||
198 (result= pk_quick_select->reset()))
200 return(pk_quick_select->get_next());
211 if (is_key_used(head, it->
index, fields))
221 str->append(
"sort_union(");
233 pk_quick_select->add_info_string(str);
240 string *used_lengths)
252 key_names->append(
",");
253 used_lengths->append(
",");
257 key_names->append(key_info->name);
259 used_lengths->append(buf, length);
263 KeyInfo *key_info= head->key_info + pk_quick_select->index;
264 key_names->append(
",");
265 key_names->append(key_info->name);
266 length= internal::int64_t2str(pk_quick_select->max_used_key_length, buf, 10) - buf;
267 used_lengths->append(
",");
268 used_lengths->append(buf, length);
void add_keys_and_lengths(std::string *key_names, std::string *used_lengths)
TODO: Rename this file - func.h is stupid.
uint32_t max_used_key_length
bool is_keys_used(const boost::dynamic_bitset<> &fields)
void add_info_string(std::string *str)
void init(size_t block_size=ROOT_MIN_BLOCK_SIZE)
Initialize memory root.
drizzle_system_variables & variables
void add_info_string(std::string *str)