112
112
#include <boost/dynamic_bitset.hpp>
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 */
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 */
145
140
using namespace std;
146
141
namespace drizzled
840
836
optimizer::SEL_IMERGE *imerge= NULL;
841
837
optimizer::TableReadPlan *best_conj_trp= NULL;
842
838
optimizer::TableReadPlan *new_conj_trp= NULL;
843
List<optimizer::SEL_IMERGE>::iterator it(tree->merges.begin());
839
List_iterator_fast<optimizer::SEL_IMERGE> it(tree->merges);
844
840
while ((imerge= it++))
846
842
new_conj_trp= get_best_disjunct_quick(session, ¶m, imerge, best_read_time);
1045
1041
/* Calculate cost(rowid_to_row_scan) */
1047
1043
optimizer::CostVector sweep_cost;
1048
Join *join= param->session->getLex()->select_lex.join;
1044
Join *join= param->session->lex->select_lex.join;
1049
1045
bool is_interrupted= test(join && join->tables == 1);
1050
1046
get_sweep_read_cost(param->table, non_cpk_scan_records, is_interrupted,
1163
1159
double roru_total_cost;
1165
1161
optimizer::CostVector sweep_cost;
1166
Join *join= param->session->getLex()->select_lex.join;
1162
Join *join= param->session->lex->select_lex.join;
1167
1163
bool is_interrupted= test(join && join->tables == 1);
1168
1164
get_sweep_read_cost(param->table, roru_total_records, is_interrupted,
1170
1166
roru_total_cost= roru_index_costs +
1171
static_cast<double>(roru_total_records)*log((double)n_child_scans) /
1167
rows2double(roru_total_records)*log((double)n_child_scans) /
1172
1168
(TIME_FOR_COMPARE_ROWID * M_LN2) +
1173
1169
sweep_cost.total_cost();
1234
1230
if (param->needed_fields.test(key_part->fieldnr-1))
1235
1231
tmp_bitset.set(key_part->fieldnr-1);
1237
double rows= param->table->quick_rows[ror_scan->keynr];
1233
double rows= rows2double(param->table->quick_rows[ror_scan->keynr]);
1238
1234
ror_scan->index_read_cost=
1239
1235
param->table->cursor->index_only_read_time(ror_scan->keynr, rows);
1240
1236
ror_scan->covered_fields= tmp_bitset.to_ulong();
1589
1588
if (! info->is_covering)
1591
1590
optimizer::CostVector sweep_cost;
1592
Join *join= info->param->session->getLex()->select_lex.join;
1591
Join *join= info->param->session->lex->select_lex.join;
1593
1592
bool is_interrupted= test(join && join->tables == 1);
1594
1593
get_sweep_read_cost(info->param->table, double2rows(info->out_rows),
1595
1594
is_interrupted, &sweep_cost);
3259
3258
#define CLONE_KEY1_MAYBE 1
3260
3259
#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);
3267
3263
static optimizer::SEL_TREE *
3268
3264
tree_and(optimizer::RangeParameter *param, optimizer::SEL_TREE *tree1, optimizer::SEL_TREE *tree2)
4567
4563
get_best_group_min_max(optimizer::Parameter *param, optimizer::SEL_TREE *tree)
4569
4565
Session *session= param->session;
4570
Join *join= session->getLex()->current_select->join;
4566
Join *join= session->lex->current_select->join;
4571
4567
Table *table= param->table;
4572
4568
bool have_min= false; /* true if there is a MIN function. */
4573
4569
bool have_max= false; /* true if there is a MAX function. */