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"
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>
62
67
#include <algorithm>
133
136
static bool add_ref_to_table_cond(Session *session, JoinTable *join_tab);
134
137
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));
137
318
Prepare of whole select (including sub queries in future).
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;
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;
217
398
select_lex->having_fix_field= 1;
218
399
bool having_fix_rc= (!having->fixed &&
219
400
(having->fix_fields(session, &having) ||
444
625
select_limit= HA_POS_ERROR;
445
626
do_send_rows = (unit->select_limit_cnt) ? 1 : 0;
446
627
// Ignore errors of execution if option IGNORE present
447
if (session->lex->ignore)
448
session->lex->current_select->no_error= 1;
628
if (session->getLex()->ignore)
629
session->getLex()->current_select->no_error= 1;
450
631
#ifdef HAVE_REF_TO_FIELDS // Not done yet
451
632
/* Add HAVING to WHERE if possible */
1858
2038
if (can_unlock && lock && session->lock &&
1859
2039
!(select_options & SELECT_NO_UNLOCK) &&
1860
2040
!select_lex->subquery_in_having &&
1861
(select_lex == (session->lex->unit.fake_select_lex ?
1862
session->lex->unit.fake_select_lex : &session->lex->select_lex)))
2041
(select_lex == (session->getLex()->unit.fake_select_lex ?
2042
session->getLex()->unit.fake_select_lex : &session->getLex()->select_lex)))
1865
2045
TODO: unlock tables even if the join isn't top level select in the
2048
2228
((Item_sum *)item)->depended_from() == select_lex))
2049
2229
*func++= (Item_sum*) item;
2051
if (before_group_by && rollup.state == ROLLUP::STATE_INITED)
2231
if (before_group_by && rollup.getState() == Rollup::STATE_INITED)
2053
rollup.state= ROLLUP::STATE_READY;
2233
rollup.setState(Rollup::STATE_READY);
2054
2234
if (rollup_make_fields(field_list, send_fields, &func))
2055
2235
return true; // Should never happen
2057
else if (rollup.state == ROLLUP::STATE_NONE)
2237
else if (rollup.getState() == Rollup::STATE_NONE)
2059
2239
for (uint32_t i=0 ; i <= send_group_parts ;i++)
2060
2240
sum_funcs_end[i]= func;
2062
else if (rollup.state == ROLLUP::STATE_READY)
2242
else if (rollup.getState() == Rollup::STATE_READY)
2063
2243
return(false); // Don't put end marker
2064
2244
*func=0; // End marker
2080
2260
tmp_table_param.group_parts= send_group_parts;
2082
if (!(rollup.null_items= (Item_null_result**) session->alloc((sizeof(Item*) +
2262
rollup.setNullItems((Item_null_result**) session->getMemRoot()->allocate((sizeof(Item*) +
2083
2263
sizeof(Item**) +
2084
2264
sizeof(List<Item>) +
2085
2265
ref_pointer_array_size)
2086
* send_group_parts )))
2266
* send_group_parts ));
2267
if (! rollup.getNullItems())
2091
rollup.fields= (List<Item>*) (rollup.null_items + send_group_parts);
2092
rollup.ref_pointer_arrays= (Item***) (rollup.fields + send_group_parts);
2093
ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts);
2272
rollup.setFields((List<Item>*) (rollup.getNullItems() + send_group_parts));
2273
rollup.setRefPointerArrays((Item***) (rollup.getFields() + send_group_parts));
2274
ref_array= (Item**) (rollup.getRefPointerArrays()+send_group_parts);
2096
2277
Prepare space for field list for the different levels
2099
2280
for (uint32_t i= 0 ; i < send_group_parts ; i++)
2101
rollup.null_items[i]= new (session->mem_root) Item_null_result();
2102
List<Item> *rollup_fields= &rollup.fields[i];
2103
rollup_fields->empty();
2104
rollup.ref_pointer_arrays[i]= ref_array;
2282
rollup.getNullItems()[i]= new (session->mem_root) Item_null_result();
2283
List<Item> *rollup_fields= &rollup.getFields()[i];
2284
rollup_fields->clear();
2285
rollup.getRefPointerArrays()[i]= ref_array;
2105
2286
ref_array+= all_fields.elements;
2321
2502
for (uint32_t i= send_group_parts ; i-- > idx ; )
2323
2504
/* Get reference pointers to sum functions in place */
2324
memcpy(ref_pointer_array, rollup.ref_pointer_arrays[i], ref_pointer_array_size);
2505
memcpy(ref_pointer_array, rollup.getRefPointerArrays()[i], ref_pointer_array_size);
2326
2507
if ((!having || having->val_int()))
2328
if (send_records < unit->select_limit_cnt && do_send_rows && result->send_data(rollup.fields[i]))
2509
if (send_records < unit->select_limit_cnt && do_send_rows && result->send_data(rollup.getFields()[i]))
2362
2543
for (uint32_t i= send_group_parts ; i-- > idx ; )
2364
2545
/* Get reference pointers to sum functions in place */
2365
memcpy(ref_pointer_array, rollup.ref_pointer_arrays[i],
2546
memcpy(ref_pointer_array, rollup.getRefPointerArrays()[i],
2366
2547
ref_pointer_array_size);
2367
2548
if ((!having || having->val_int()))
2369
2550
int write_error;
2371
List_iterator_fast<Item> it(rollup.fields[i]);
2552
List<Item>::iterator it(rollup.getFields()[i].begin());
2372
2553
while ((item= it++))
2374
2555
if (item->type() == Item::NULL_ITEM && item->is_result_field())
3050
3231
have STRING_RESULT result type, we increase the length
3051
3232
by 8 as maximum pack length of such fields.
3053
if (type == DRIZZLE_TYPE_DATE ||
3054
type == DRIZZLE_TYPE_TIME ||
3055
type == DRIZZLE_TYPE_DATETIME ||
3056
type == DRIZZLE_TYPE_MICROTIME ||
3057
type == DRIZZLE_TYPE_TIMESTAMP)
3234
if (field::isDateTime(type))
3059
3236
key_length+= 8;
5467
5650
bool *hidden_group_fields)
5470
nesting_map save_allow_sum_func=session->lex->allow_sum_func ;
5653
nesting_map save_allow_sum_func=session->getLex()->allow_sum_func ;
5472
session->lex->allow_sum_func&= ~(1 << session->lex->current_select->nest_level);
5655
session->getLex()->allow_sum_func&= ~(1 << session->getLex()->current_select->nest_level);
5473
5656
res= session->setup_conds(tables, conds);
5475
session->lex->allow_sum_func|= 1 << session->lex->current_select->nest_level;
5658
session->getLex()->allow_sum_func|= 1 << session->getLex()->current_select->nest_level;
5476
5659
res= res || setup_order(session, ref_pointer_array, tables, fields, all_fields,
5478
session->lex->allow_sum_func&= ~(1 << session->lex->current_select->nest_level);
5661
session->getLex()->allow_sum_func&= ~(1 << session->getLex()->current_select->nest_level);
5479
5662
res= res || setup_group(session, ref_pointer_array, tables, fields, all_fields,
5480
5663
group, hidden_group_fields);
5481
session->lex->allow_sum_func= save_allow_sum_func;
5664
session->getLex()->allow_sum_func= save_allow_sum_func;
5519
5702
table_count= join->tables;
5520
5703
stat= (JoinTable*) join->session->calloc(sizeof(JoinTable)*table_count);
5521
stat_ref= (JoinTable**) join->session->alloc(sizeof(JoinTable*)*MAX_TABLES);
5522
table_vector= (Table**) join->session->alloc(sizeof(Table*)*(table_count*2));
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));
5523
5706
if (! stat || ! stat_ref || ! table_vector)