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_union_select.h>
26 #include <drizzled/table.h>
27 #include <drizzled/system_variables.h>
36 optimizer::QuickRorUnionSelect::QuickRorUnionSelect(Session *session_param,
39 session(session_param),
47 session_param->mem_root= &
alloc;
63 int val=
self->head->cursor->cmp_ref(i->
last_rowid,
73 cur_rowid= alloc.alloc(2 * head->cursor->ref_length);
74 prev_rowid= cur_rowid + head->cursor->ref_length;
81 have_prev_rowid=
false;
93 while (not queue->empty())
105 if (it->
get_next() == HA_ERR_END_OF_FILE)
110 if (head->cursor->startTableScan(1))
118 quick_selects.push_back(quick_sel_range);
122 optimizer::QuickRorUnionSelect::~QuickRorUnionSelect()
124 while (! queue->empty())
129 for_each(quick_selects.begin(),
132 quick_selects.clear();
133 if (head->cursor->inited != Cursor::NONE)
135 head->cursor->endTableScan();
137 alloc.free_root(MYF(0));
157 unsigned char *tmp= NULL;
164 return HA_ERR_END_OF_FILE;
168 memcpy(cur_rowid, quick->
last_rowid, rowid_length);
173 if (error != HA_ERR_END_OF_FILE)
184 if (!have_prev_rowid)
188 have_prev_rowid=
true;
191 dup_row= ! head->cursor->cmp_ref(cur_rowid, prev_rowid);
195 cur_rowid= prev_rowid;
198 error= head->cursor->rnd_pos(quick->
record, prev_rowid);
199 }
while (error == HA_ERR_RECORD_DELETED);
207 str->append(
"union(");
229 used_lengths->append(
",");
230 key_names->append(
",");