112
112
#include <boost/dynamic_bitset.hpp>
114
#include "drizzled/sql_base.h"
115
#include "drizzled/sql_select.h"
116
#include "drizzled/error.h"
117
#include "drizzled/optimizer/cost_vector.h"
118
#include "drizzled/item/cmpfunc.h"
119
#include "drizzled/field/num.h"
120
#include "drizzled/check_stack_overrun.h"
121
#include "drizzled/optimizer/sum.h"
122
#include "drizzled/optimizer/range.h"
123
#include "drizzled/optimizer/quick_range.h"
124
#include "drizzled/optimizer/quick_range_select.h"
125
#include "drizzled/optimizer/quick_group_min_max_select.h"
126
#include "drizzled/optimizer/quick_index_merge_select.h"
127
#include "drizzled/optimizer/quick_ror_intersect_select.h"
128
#include "drizzled/optimizer/quick_ror_union_select.h"
129
#include "drizzled/optimizer/table_read_plan.h"
130
#include "drizzled/optimizer/sel_arg.h"
131
#include "drizzled/optimizer/sel_imerge.h"
132
#include "drizzled/optimizer/sel_tree.h"
133
#include "drizzled/optimizer/range_param.h"
134
#include "drizzled/records.h"
135
#include "drizzled/internal/my_sys.h"
136
#include "drizzled/internal/iocache.h"
138
#include "drizzled/temporal.h" /* Needed in get_mm_leaf() for timestamp -> datetime comparisons */
114
#include <drizzled/check_stack_overrun.h>
115
#include <drizzled/error.h>
116
#include <drizzled/field/num.h>
117
#include <drizzled/internal/iocache.h>
118
#include <drizzled/internal/my_sys.h>
119
#include <drizzled/item/cmpfunc.h>
120
#include <drizzled/optimizer/cost_vector.h>
121
#include <drizzled/optimizer/quick_group_min_max_select.h>
122
#include <drizzled/optimizer/quick_index_merge_select.h>
123
#include <drizzled/optimizer/quick_range.h>
124
#include <drizzled/optimizer/quick_range_select.h>
125
#include <drizzled/optimizer/quick_ror_intersect_select.h>
126
#include <drizzled/optimizer/quick_ror_union_select.h>
127
#include <drizzled/optimizer/range.h>
128
#include <drizzled/optimizer/range_param.h>
129
#include <drizzled/optimizer/sel_arg.h>
130
#include <drizzled/optimizer/sel_imerge.h>
131
#include <drizzled/optimizer/sel_tree.h>
132
#include <drizzled/optimizer/sum.h>
133
#include <drizzled/optimizer/table_read_plan.h>
134
#include <drizzled/plugin/storage_engine.h>
135
#include <drizzled/records.h>
136
#include <drizzled/sql_base.h>
137
#include <drizzled/sql_select.h>
138
#include <drizzled/table_reference.h>
139
#include <drizzled/session.h>
141
#include <drizzled/unique.h>
143
#include <drizzled/temporal.h> /* Needed in get_mm_leaf() for timestamp -> datetime comparisons */
140
145
using namespace std;
141
146
namespace drizzled
464
469
MAX_KEY if no such index was found.
467
uint32_t optimizer::get_index_for_order(Table *table, order_st *order, ha_rows limit)
472
uint32_t optimizer::get_index_for_order(Table *table, Order *order, ha_rows limit)
470
475
uint32_t match_key= MAX_KEY, match_key_len= MAX_KEY_LENGTH + 1;
473
478
for (ord= order; ord; ord= ord->next)
836
840
optimizer::SEL_IMERGE *imerge= NULL;
837
841
optimizer::TableReadPlan *best_conj_trp= NULL;
838
842
optimizer::TableReadPlan *new_conj_trp= NULL;
839
List_iterator_fast<optimizer::SEL_IMERGE> it(tree->merges);
843
List<optimizer::SEL_IMERGE>::iterator it(tree->merges.begin());
840
844
while ((imerge= it++))
842
846
new_conj_trp= get_best_disjunct_quick(session, ¶m, imerge, best_read_time);
1041
1045
/* Calculate cost(rowid_to_row_scan) */
1043
1047
optimizer::CostVector sweep_cost;
1044
Join *join= param->session->lex->select_lex.join;
1048
Join *join= param->session->getLex()->select_lex.join;
1045
1049
bool is_interrupted= test(join && join->tables == 1);
1046
1050
get_sweep_read_cost(param->table, non_cpk_scan_records, is_interrupted,
1159
1163
double roru_total_cost;
1161
1165
optimizer::CostVector sweep_cost;
1162
Join *join= param->session->lex->select_lex.join;
1166
Join *join= param->session->getLex()->select_lex.join;
1163
1167
bool is_interrupted= test(join && join->tables == 1);
1164
1168
get_sweep_read_cost(param->table, roru_total_records, is_interrupted,
1166
1170
roru_total_cost= roru_index_costs +
1167
rows2double(roru_total_records)*log((double)n_child_scans) /
1171
static_cast<double>(roru_total_records)*log((double)n_child_scans) /
1168
1172
(TIME_FOR_COMPARE_ROWID * M_LN2) +
1169
1173
sweep_cost.total_cost();
1230
1234
if (param->needed_fields.test(key_part->fieldnr-1))
1231
1235
tmp_bitset.set(key_part->fieldnr-1);
1233
double rows= rows2double(param->table->quick_rows[ror_scan->keynr]);
1237
double rows= param->table->quick_rows[ror_scan->keynr];
1234
1238
ror_scan->index_read_cost=
1235
1239
param->table->cursor->index_only_read_time(ror_scan->keynr, rows);
1236
1240
ror_scan->covered_fields= tmp_bitset.to_ulong();
1588
1589
if (! info->is_covering)
1590
1591
optimizer::CostVector sweep_cost;
1591
Join *join= info->param->session->lex->select_lex.join;
1592
Join *join= info->param->session->getLex()->select_lex.join;
1592
1593
bool is_interrupted= test(join && join->tables == 1);
1593
1594
get_sweep_read_cost(info->param->table, double2rows(info->out_rows),
1594
1595
is_interrupted, &sweep_cost);
3258
3259
#define CLONE_KEY1_MAYBE 1
3259
3260
#define CLONE_KEY2_MAYBE 2
3260
#define swap_clone_flag(A) ((A & 1) << 1) | ((A & 2) >> 1)
3262
static uint32_t swap_clone_flag(uint32_t a)
3264
return ((a & 1) << 1) | ((a & 2) >> 1);
3263
3267
static optimizer::SEL_TREE *
3264
3268
tree_and(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree1, optimizer::SEL_TREE *tree2)
4563
4567
get_best_group_min_max(optimizer::Parameter *param, optimizer::SEL_TREE *tree)
4565
4569
Session *session= param->session;
4566
Join *join= session->lex->current_select->join;
4570
Join *join= session->getLex()->current_select->join;
4567
4571
Table *table= param->table;
4568
4572
bool have_min= false; /* true if there is a MIN function. */
4569
4573
bool have_max= false; /* true if there is a MAX function. */