18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include "drizzled/session.h"
23
#include "drizzled/join_table.h"
24
#include "drizzled/table.h"
25
#include "drizzled/sql_select.h"
26
#include "drizzled/internal/my_sys.h"
27
#include "drizzled/optimizer/access_method/scan.h"
22
#include <drizzled/join_table.h>
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>
29
31
using namespace drizzled;
31
33
static uint32_t make_join_orderinfo(Join *join);
33
bool optimizer::Scan::getStats(Table *table,
35
void optimizer::Scan::getStats(Table& table, JoinTable& join_tab)
36
Join *join= join_tab->join;
37
Join *join= join_tab.join;
37
38
bool statistics= test(! (join->select_options & SELECT_DESCRIBE));
38
39
uint64_t options= (join->select_options &
39
40
(SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) |
41
42
uint32_t no_jbuf_after= make_join_orderinfo(join);
42
uint32_t index= join_tab - join->join_tab;
43
uint32_t index= &join_tab - join->join_tab;
45
46
* If previous table use cache
46
47
* If the incoming data set is already sorted don't use cache.
48
table->status= STATUS_NO_RECORD;
49
table.status= STATUS_NO_RECORD;
50
51
if (index != join->const_tables &&
51
52
! (options & SELECT_NO_JOIN_CACHE) &&
52
join_tab->use_quick != 2 &&
53
! join_tab->first_inner &&
53
join_tab.use_quick != 2 &&
54
! join_tab.first_inner &&
54
55
index <= no_jbuf_after &&
55
! join_tab->insideout_match_tab)
56
! join_tab.insideout_match_tab)
57
58
if ((options & SELECT_DESCRIBE) ||
58
59
! join_init_cache(join->session,
59
60
join->join_tab + join->const_tables,
60
61
index - join->const_tables))
62
join_tab[-1].next_select= sub_select_cache; /* Patch previous */
63
(&join_tab)[-1].next_select= sub_select_cache; /* Patch previous */
66
67
/* These init changes read_record */
67
if (join_tab->use_quick == 2)
68
if (join_tab.use_quick == 2)
69
70
join->session->server_status|= SERVER_QUERY_NO_GOOD_INDEX_USED;
70
join_tab->read_first_record= join_init_quick_read_record;
71
join_tab.read_first_record= join_init_quick_read_record;
73
74
join->session->status_var.select_range_check_count++;
78
join_tab->read_first_record= join_init_read_record;
79
join_tab.read_first_record= join_init_read_record;
79
80
if (index == join->const_tables)
81
if (join_tab->select && join_tab->select->quick)
82
if (join_tab.select && join_tab.select->quick)
85
85
join->session->status_var.select_range_count++;
90
89
join->session->server_status|= SERVER_QUERY_NO_INDEX_USED;
93
91
join->session->status_var.select_scan_count++;
99
if (join_tab->select && join_tab->select->quick)
96
if (join_tab.select && join_tab.select->quick)
103
99
join->session->status_var.select_full_range_join_count++;
108
103
join->session->server_status|= SERVER_QUERY_NO_INDEX_USED;
111
105
join->session->status_var.select_full_join_count++;
115
if (! table->no_keyread)
108
if (! table.no_keyread)
117
if (join_tab->select &&
118
join_tab->select->quick &&
119
join_tab->select->quick->index != MAX_KEY && //not index_merge
120
table->covering_keys.test(join_tab->select->quick->index))
110
if (join_tab.select &&
111
join_tab.select->quick &&
112
join_tab.select->quick->index != MAX_KEY && //not index_merge
113
table.covering_keys.test(join_tab.select->quick->index))
123
table->cursor->extra(HA_EXTRA_KEYREAD);
116
table.cursor->extra(HA_EXTRA_KEYREAD);
125
else if (! table->covering_keys.none() &&
126
! (join_tab->select && join_tab->select->quick))
118
else if (! table.covering_keys.none() && ! (join_tab.select && join_tab.select->quick))
127
119
{ // Only read index tree
128
if (! join_tab->insideout_match_tab)
120
if (! join_tab.insideout_match_tab)
131
123
See bug #26447: "Using the clustered index for a table scan
132
124
is always faster than using a secondary index".
134
if (table->getShare()->hasPrimaryKey() &&
135
table->cursor->primary_key_is_clustered())
126
if (table.getShare()->hasPrimaryKey() &&
127
table.cursor->primary_key_is_clustered())
137
join_tab->index= table->getShare()->getPrimaryKey();
129
join_tab.index= table.getShare()->getPrimaryKey();
141
join_tab->index= table->find_shortest_key(&table->covering_keys);
133
join_tab.index= table.find_shortest_key(&table.covering_keys);
144
join_tab->read_first_record= join_read_first;
145
join_tab->type= AM_NEXT; // Read with index_first / index_next
136
join_tab.read_first_record= join_read_first;
137
join_tab.type= AM_NEXT; // Read with index_first / index_next