21 #include <drizzled/session.h>
22 #include <drizzled/util/functors.h>
23 #include <drizzled/optimizer/range.h>
24 #include <drizzled/optimizer/quick_range_select.h>
25 #include <drizzled/optimizer/quick_ror_intersect_select.h>
26 #include <drizzled/internal/m_string.h>
27 #include <drizzled/key.h>
28 #include <drizzled/table.h>
29 #include <drizzled/system_variables.h>
37 optimizer::QuickRorIntersectSelect::QuickRorIntersectSelect(Session *session_param,
39 bool retrieve_full_rows,
40 memory::Root *parent_alloc)
43 session(session_param),
44 need_to_fetch_row(retrieve_full_rows),
56 memset(&alloc, 0,
sizeof(memory::Root));
65 optimizer::QuickRorIntersectSelect::~QuickRorIntersectSelect()
67 for_each(quick_selects.begin(),
70 quick_selects.clear();
72 alloc.free_root(MYF(0));
73 if (need_to_fetch_row && head->cursor->inited != Cursor::NONE)
75 head->cursor->endTableScan();
84 return (! last_rowid);
90 vector<optimizer::QuickRangeSelect*>::iterator it= quick_selects.begin();
93 assert(! need_to_fetch_row || reuse_handler);
94 if (not need_to_fetch_row && reuse_handler)
104 quick->cursor->extra(HA_EXTRA_KEYREAD_PRESERVE_FIELDS);
106 while (it != quick_selects.end())
108 if ((*it)->init_ror_merged_scan(
false))
112 (*it)->cursor->extra(HA_EXTRA_KEYREAD_PRESERVE_FIELDS);
114 (*it)->record= head->record[0];
118 if (need_to_fetch_row && head->cursor->startTableScan(1))
128 if (! scans_inited && init_ror_merged_scan(
true))
139 quick_selects.push_back(quick);
147 if (is_key_used(head, it->
index, fields))
157 vector<optimizer::QuickRangeSelect *>::iterator it= quick_selects.begin();
160 uint32_t last_rowid_count= 0;
170 while (! error && ! cpk_quick->row_in_ranges())
176 quick->cursor->position(quick->
record);
177 memcpy(last_rowid, quick->cursor->ref, head->cursor->ref_length);
180 while (last_rowid_count < quick_selects.size())
183 if (it != quick_selects.end())
190 it= quick_selects.begin();
199 quick->cursor->position(quick->
record);
200 cmp= head->cursor->cmp_ref(quick->cursor->ref, last_rowid);
209 while (! cpk_quick->row_in_ranges())
215 memcpy(last_rowid, quick->cursor->ref, head->cursor->ref_length);
226 if (need_to_fetch_row)
227 error= head->cursor->rnd_pos(head->record[0], last_rowid);
228 }
while (error == HA_ERR_RECORD_DELETED);
236 str->append(
"intersect(");
244 str->append(key_info->name);
248 KeyInfo *key_info= head->key_info + cpk_quick->index;
250 str->append(key_info->name);
257 string *used_lengths)
271 key_names->append(
",");
272 used_lengths->append(
",");
274 key_names->append(key_info->name);
276 used_lengths->append(buf, length);
281 KeyInfo *key_info= head->key_info + cpk_quick->index;
282 key_names->append(
",");
283 key_names->append(key_info->name);
284 length= internal::int64_t2str(cpk_quick->max_used_key_length, buf, 10) - buf;
285 used_lengths->append(
",");
286 used_lengths->append(buf, length);