35
#include <drizzled/item/cache.h>
36
#include <drizzled/item/cmpfunc.h>
37
#include <drizzled/item/copy_string.h>
38
#include <drizzled/item/uint.h>
39
#include <drizzled/cached_item.h>
40
#include <drizzled/sql_base.h>
41
#include <drizzled/sql_select.h> /* include join.h */
42
#include <drizzled/lock.h>
43
#include <drizzled/nested_join.h>
44
#include <drizzled/join.h>
45
#include <drizzled/join_cache.h>
46
#include <drizzled/show.h>
47
#include <drizzled/field/blob.h>
48
#include <drizzled/optimizer/position.h>
49
#include <drizzled/optimizer/sargable_param.h>
50
#include <drizzled/optimizer/key_use.h>
51
#include <drizzled/optimizer/range.h>
52
#include <drizzled/optimizer/sum.h>
53
#include <drizzled/optimizer/explain_plan.h>
54
#include <drizzled/optimizer/access_method_factory.h>
55
#include <drizzled/optimizer/access_method.h>
56
#include <drizzled/records.h>
57
#include <drizzled/probes.h>
58
#include <drizzled/internal/my_bit.h>
59
#include <drizzled/internal/my_sys.h>
60
#include <drizzled/internal/iocache.h>
61
#include <drizzled/plugin/storage_engine.h>
62
#include <drizzled/session.h>
63
#include <drizzled/select_result.h>
65
#include <drizzled/debug.h>
35
#include "drizzled/item/cache.h"
36
#include "drizzled/item/cmpfunc.h"
37
#include "drizzled/item/copy_string.h"
38
#include "drizzled/item/uint.h"
39
#include "drizzled/cached_item.h"
40
#include "drizzled/sql_base.h"
41
#include "drizzled/sql_select.h" /* include join.h */
42
#include "drizzled/lock.h"
43
#include "drizzled/nested_join.h"
44
#include "drizzled/join.h"
45
#include "drizzled/join_cache.h"
46
#include "drizzled/show.h"
47
#include "drizzled/field/blob.h"
48
#include "drizzled/optimizer/position.h"
49
#include "drizzled/optimizer/sargable_param.h"
50
#include "drizzled/optimizer/key_use.h"
51
#include "drizzled/optimizer/range.h"
52
#include "drizzled/optimizer/sum.h"
53
#include "drizzled/optimizer/explain_plan.h"
54
#include "drizzled/optimizer/access_method_factory.h"
55
#include "drizzled/optimizer/access_method.h"
56
#include "drizzled/records.h"
57
#include "drizzled/probes.h"
58
#include "drizzled/internal/my_bit.h"
59
#include "drizzled/internal/my_sys.h"
60
#include "drizzled/internal/iocache.h"
67
62
#include <algorithm>
136
133
static bool add_ref_to_table_cond(Session *session, JoinTable *join_tab);
137
134
static void free_blobs(Field **ptr); /* Rename this method...conflicts with another in global namespace... */
139
Join::Join(Session *session_arg,
140
List<Item> &fields_arg,
141
uint64_t select_options_arg,
142
select_result *result_arg) :
154
sort_and_group(false),
158
no_field_update(false),
160
resume_nested_loop(false),
161
no_const_tables(false),
162
select_distinct(false),
163
group_optimized_away(false),
167
skip_sort_order(false),
171
hidden_group_fields(false),
173
found_const_table_map(0),
180
fetch_limit(HA_POS_ERROR),
181
session(session_arg),
182
fields_list(fields_arg),
187
exec_tmp_table1(NULL),
188
exec_tmp_table2(NULL),
193
having_history(NULL),
194
select_options(select_options_arg),
196
lock(session_arg->lock),
198
all_fields(fields_arg),
202
ref_pointer_array(NULL),
207
ref_pointer_array_size(0),
208
zero_result_cause(NULL),
211
join_tab_reexec(NULL)
213
select_distinct= test(select_options & SELECT_DISTINCT);
214
if (&fields_list != &fields_arg) /* only copy if not same*/
215
fields_list= fields_arg;
216
memset(&keyuse, 0, sizeof(keyuse));
217
tmp_table_param.init();
218
tmp_table_param.end_write_records= HA_POS_ERROR;
219
rollup.setState(Rollup::STATE_NONE);
223
* This method is currently only used when a subselect EXPLAIN is performed.
224
* I pulled out the init() method and have simply reset the values to what
225
* was previously in the init() method. See the note about the hack in
228
void Join::reset(Session *session_arg,
229
List<Item> &fields_arg,
230
uint64_t select_options_arg,
231
select_result *result_arg)
244
sort_and_group= false;
248
no_field_update= false;
250
resume_nested_loop= false;
251
no_const_tables= false;
252
select_distinct= false;
253
group_optimized_away= false;
257
skip_sort_order= false;
261
hidden_group_fields= false;
263
found_const_table_map= 0;
270
fetch_limit= HA_POS_ERROR;
271
session= session_arg;
272
fields_list= fields_arg;
277
exec_tmp_table1= NULL;
278
exec_tmp_table2= NULL;
283
having_history= NULL;
284
select_options= select_options_arg;
286
lock= session_arg->lock;
288
all_fields= fields_arg;
292
ref_pointer_array= NULL;
297
ref_pointer_array_size= 0;
298
zero_result_cause= NULL;
301
join_tab_reexec= NULL;
302
select_distinct= test(select_options & SELECT_DISTINCT);
303
if (&fields_list != &fields_arg) /* only copy if not same*/
304
fields_list= fields_arg;
305
memset(&keyuse, 0, sizeof(keyuse));
306
tmp_table_param.init();
307
tmp_table_param.end_write_records= HA_POS_ERROR;
308
rollup.setState(Rollup::STATE_NONE);
311
bool Join::is_top_level_join() const
313
return (unit == &session->getLex()->unit && (unit->fake_select_lex == 0 ||
314
select_lex == unit->fake_select_lex));
318
137
Prepare of whole select (including sub queries in future).
395
nesting_map save_allow_sum_func= session->getLex()->allow_sum_func;
396
session->setWhere("having clause");
397
session->getLex()->allow_sum_func|= 1 << select_lex_arg->nest_level;
214
nesting_map save_allow_sum_func= session->lex->allow_sum_func;
215
session->where="having clause";
216
session->lex->allow_sum_func|= 1 << select_lex_arg->nest_level;
398
217
select_lex->having_fix_field= 1;
399
218
bool having_fix_rc= (!having->fixed &&
400
219
(having->fix_fields(session, &having) ||
625
444
select_limit= HA_POS_ERROR;
626
445
do_send_rows = (unit->select_limit_cnt) ? 1 : 0;
627
446
// Ignore errors of execution if option IGNORE present
628
if (session->getLex()->ignore)
629
session->getLex()->current_select->no_error= 1;
447
if (session->lex->ignore)
448
session->lex->current_select->no_error= 1;
631
450
#ifdef HAVE_REF_TO_FIELDS // Not done yet
632
451
/* Add HAVING to WHERE if possible */
2038
1858
if (can_unlock && lock && session->lock &&
2039
1859
!(select_options & SELECT_NO_UNLOCK) &&
2040
1860
!select_lex->subquery_in_having &&
2041
(select_lex == (session->getLex()->unit.fake_select_lex ?
2042
session->getLex()->unit.fake_select_lex : &session->getLex()->select_lex)))
1861
(select_lex == (session->lex->unit.fake_select_lex ?
1862
session->lex->unit.fake_select_lex : &session->lex->select_lex)))
2045
1865
TODO: unlock tables even if the join isn't top level select in the
3231
3051
have STRING_RESULT result type, we increase the length
3232
3052
by 8 as maximum pack length of such fields.
3234
if (field::isDateTime(type))
3054
if (type == DRIZZLE_TYPE_DATE ||
3055
type == DRIZZLE_TYPE_TIME ||
3056
type == DRIZZLE_TYPE_DATETIME ||
3057
type == DRIZZLE_TYPE_MICROTIME ||
3058
type == DRIZZLE_TYPE_TIMESTAMP)
3236
3060
key_length+= 8;
5650
5468
bool *hidden_group_fields)
5653
nesting_map save_allow_sum_func=session->getLex()->allow_sum_func ;
5471
nesting_map save_allow_sum_func=session->lex->allow_sum_func ;
5655
session->getLex()->allow_sum_func&= ~(1 << session->getLex()->current_select->nest_level);
5473
session->lex->allow_sum_func&= ~(1 << session->lex->current_select->nest_level);
5656
5474
res= session->setup_conds(tables, conds);
5658
session->getLex()->allow_sum_func|= 1 << session->getLex()->current_select->nest_level;
5476
session->lex->allow_sum_func|= 1 << session->lex->current_select->nest_level;
5659
5477
res= res || setup_order(session, ref_pointer_array, tables, fields, all_fields,
5661
session->getLex()->allow_sum_func&= ~(1 << session->getLex()->current_select->nest_level);
5479
session->lex->allow_sum_func&= ~(1 << session->lex->current_select->nest_level);
5662
5480
res= res || setup_group(session, ref_pointer_array, tables, fields, all_fields,
5663
5481
group, hidden_group_fields);
5664
session->getLex()->allow_sum_func= save_allow_sum_func;
5482
session->lex->allow_sum_func= save_allow_sum_func;
5702
5520
table_count= join->tables;
5703
5521
stat= (JoinTable*) join->session->calloc(sizeof(JoinTable)*table_count);
5704
stat_ref= (JoinTable**) join->session->getMemRoot()->allocate(sizeof(JoinTable*)*MAX_TABLES);
5705
table_vector= (Table**) join->session->getMemRoot()->allocate(sizeof(Table*)*(table_count*2));
5522
stat_ref= (JoinTable**) join->session->alloc(sizeof(JoinTable*)*MAX_TABLES);
5523
table_vector= (Table**) join->session->alloc(sizeof(Table*)*(table_count*2));
5706
5524
if (! stat || ! stat_ref || ! table_vector)