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