23 #include <drizzled/table.h>
24 #include <drizzled/sql_select.h>
25 #include <drizzled/internal/my_sys.h>
26 #include <drizzled/optimizer/access_method/scan.h>
27 #include <drizzled/util/test.h>
28 #include <drizzled/statistics_variables.h>
29 #include <drizzled/session.h>
31 using namespace drizzled;
33 static uint32_t make_join_orderinfo(
Join *join);
37 Join *join= join_tab.join;
38 bool statistics= test(! (join->select_options & SELECT_DESCRIBE));
39 uint64_t options= (join->select_options &
40 (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) |
42 uint32_t no_jbuf_after= make_join_orderinfo(join);
43 uint32_t index= &join_tab - join->join_tab;
49 table.status= STATUS_NO_RECORD;
51 if (index != join->const_tables &&
52 ! (options & SELECT_NO_JOIN_CACHE) &&
53 join_tab.use_quick != 2 &&
55 index <= no_jbuf_after &&
58 if ((options & SELECT_DESCRIBE) ||
59 ! join_init_cache(join->session,
60 join->join_tab + join->const_tables,
61 index - join->const_tables))
63 (&join_tab)[-1].next_select= sub_select_cache;
68 if (join_tab.use_quick == 2)
70 join->session->server_status|= SERVER_QUERY_NO_GOOD_INDEX_USED;
71 join_tab.read_first_record= join_init_quick_read_record;
74 join->session->status_var.select_range_check_count++;
79 join_tab.read_first_record= join_init_read_record;
80 if (index == join->const_tables)
82 if (join_tab.select && join_tab.select->
quick)
85 join->session->status_var.select_range_count++;
89 join->session->server_status|= SERVER_QUERY_NO_INDEX_USED;
91 join->session->status_var.select_scan_count++;
96 if (join_tab.select && join_tab.select->
quick)
99 join->session->status_var.select_full_range_join_count++;
103 join->session->server_status|= SERVER_QUERY_NO_INDEX_USED;
105 join->session->status_var.select_full_join_count++;
108 if (! table.no_keyread)
110 if (join_tab.select &&
111 join_tab.select->
quick &&
113 table.covering_keys.test(join_tab.select->
quick->
index))
116 table.
cursor->extra(HA_EXTRA_KEYREAD);
118 else if (! table.covering_keys.none() && ! (join_tab.select && join_tab.select->
quick))
126 if (table.getShare()->hasPrimaryKey() &&
127 table.
cursor->primary_key_is_clustered())
129 join_tab.index= table.getShare()->getPrimaryKey();
133 join_tab.index= table.find_shortest_key(&table.covering_keys);
136 join_tab.read_first_record= join_read_first;
137 join_tab.
type= AM_NEXT;
152 static uint32_t make_join_orderinfo(
Join *join)
157 uint32_t i= join->const_tables;
158 for (; i < join->
tables; i++)
161 Table *table= tab->table;