22
22
@defgroup Query_Optimizer Query Optimizer
28
28
#include <iostream>
29
29
#include <algorithm>
32
#include <drizzled/sql_select.h> /* include join.h */
34
#include <drizzled/error.h>
35
#include <drizzled/gettext.h>
36
#include <drizzled/util/test.h>
37
#include <drizzled/name_resolution_context_state.h>
38
#include <drizzled/nested_join.h>
39
#include <drizzled/probes.h>
40
#include <drizzled/show.h>
41
#include <drizzled/item/cache.h>
42
#include <drizzled/item/cmpfunc.h>
43
#include <drizzled/item/copy_string.h>
44
#include <drizzled/item/uint.h>
45
#include <drizzled/cached_item.h>
46
#include <drizzled/sql_base.h>
47
#include <drizzled/field/blob.h>
48
#include <drizzled/check_stack_overrun.h>
49
#include <drizzled/lock.h>
50
#include <drizzled/item/outer_ref.h>
51
#include <drizzled/index_hint.h>
52
#include <drizzled/records.h>
53
#include <drizzled/internal/iocache.h>
54
#include <drizzled/drizzled.h>
55
#include <drizzled/plugin/storage_engine.h>
57
#include <drizzled/sql_union.h>
58
#include <drizzled/optimizer/key_field.h>
59
#include <drizzled/optimizer/position.h>
60
#include <drizzled/optimizer/sargable_param.h>
61
#include <drizzled/optimizer/key_use.h>
62
#include <drizzled/optimizer/range.h>
63
#include <drizzled/optimizer/quick_range_select.h>
64
#include <drizzled/optimizer/quick_ror_intersect_select.h>
66
#include <drizzled/filesort.h>
67
#include <drizzled/sql_lex.h>
68
#include <drizzled/session.h>
69
#include <drizzled/sort_field.h>
70
#include <drizzled/select_result.h>
32
#include "drizzled/sql_select.h" /* include join.h */
34
#include "drizzled/error.h"
35
#include "drizzled/gettext.h"
36
#include "drizzled/util/test.h"
37
#include "drizzled/name_resolution_context_state.h"
38
#include "drizzled/nested_join.h"
39
#include "drizzled/probes.h"
40
#include "drizzled/show.h"
41
#include "drizzled/item/cache.h"
42
#include "drizzled/item/cmpfunc.h"
43
#include "drizzled/item/copy_string.h"
44
#include "drizzled/item/uint.h"
45
#include "drizzled/cached_item.h"
46
#include "drizzled/sql_base.h"
47
#include "drizzled/field/blob.h"
48
#include "drizzled/check_stack_overrun.h"
49
#include "drizzled/lock.h"
50
#include "drizzled/item/outer_ref.h"
51
#include "drizzled/index_hint.h"
52
#include "drizzled/records.h"
53
#include "drizzled/internal/iocache.h"
54
#include "drizzled/drizzled.h"
56
#include "drizzled/sql_union.h"
57
#include "drizzled/optimizer/key_field.h"
58
#include "drizzled/optimizer/position.h"
59
#include "drizzled/optimizer/sargable_param.h"
60
#include "drizzled/optimizer/key_use.h"
61
#include "drizzled/optimizer/range.h"
62
#include "drizzled/optimizer/quick_range_select.h"
63
#include "drizzled/optimizer/quick_ror_intersect_select.h"
65
#include "drizzled/filesort.h"
72
67
using namespace std;
213
208
bool direct_ref= false;
215
List<Item_outer_ref>::iterator ref_it(select->inner_refs_list.begin());
210
List_iterator<Item_outer_ref> ref_it(select->inner_refs_list);
216
211
while ((ref= ref_it++))
218
213
Item *item= ref->outer_ref;
219
214
Item **item_ref= ref->ref;
220
215
Item_ref *new_ref;
222
@todo this field item already might be present in the select list.
217
TODO: this field item already might be present in the select list.
223
218
In this case instead of adding new field item we could use an
224
219
existing one. The change will lead to less operations for copying fields,
225
220
smaller temporary tables and less data passed through filesort.
1905
1901
Item_cond_and *and_cond= new Item_cond_and(eq_list);
1906
1902
and_cond->quick_fix_field();
1907
1903
List<Item> *args= and_cond->argument_list();
1908
List<Item_equal>::iterator it(cond_equal.current_level.begin());
1904
List_iterator_fast<Item_equal> it(cond_equal.current_level);
1909
1905
while ((item_equal= it++))
1911
1907
item_equal->fix_length_and_dec();
1912
1908
item_equal->update_used_tables();
1913
set_if_bigger(session->getLex()->current_select->max_equal_elems,
1909
set_if_bigger(session->lex->current_select->max_equal_elems,
1914
1910
item_equal->members());
1916
1912
and_cond->cond_equal= cond_equal;
3371
int join_read_system(JoinTable *tab)
3373
Table *table= tab->table;
3375
if (table->status & STATUS_GARBAGE) // If first read
3377
if ((error=table->cursor->read_first_row(table->getInsertRecord(),
3378
table->getShare()->getPrimaryKey())))
3380
if (error != HA_ERR_END_OF_FILE)
3381
return table->report_error(error);
3382
tab->table->mark_as_null_row();
3383
table->emptyRecord(); // Make empty record
3386
table->storeRecord();
3388
else if (!table->status) // Only happens with left join
3389
table->restoreRecord(); // restore old record
3391
return table->status ? -1 : 0;
3375
3395
Read a (constant) table when there is at most one matching row.