~drizzle-trunk/drizzle/development

1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
1999.6.1 by kalebral at gmail
update Copyright strings to a more common format to help with creating the master debian copyright file
4
 *  Copyright (C) 2008-2009 Sun Microsystems, Inc.
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
21
/**
22
 * @file
23
 *
1541.1.1 by Brian Aker
JOIN -> Join rename
24
 * Defines the Join class
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
25
 */
26
27
#ifndef DRIZZLED_JOIN_H
28
#define DRIZZLED_JOIN_H
29
1108.6.29 by Padraig O'Sullivan
Added an optimizer namespace and sub-directory within drizzled. Moved the
30
#include <drizzled/optimizer/position.h>
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
31
#include "drizzled/sql_select.h"
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
32
#include <bitset>
33
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
34
namespace drizzled
35
{
36
1541.1.1 by Brian Aker
JOIN -> Join rename
37
class Join :public memory::SqlAlloc
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
38
{
1541.1.1 by Brian Aker
JOIN -> Join rename
39
  Join(const Join &rhs);                        /**< not implemented */
40
  Join& operator=(const Join &rhs);             /**< not implemented */
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
41
42
  /**
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
43
   * Contains a partial query execution plan which is extended during
44
   * cost-based optimization.
45
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
46
  optimizer::Position positions[MAX_TABLES+1];
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
47
48
  /**
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
49
   * Contains the optimal query execution plan after cost-based optimization
50
   * has taken place. 
51
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
52
  optimizer::Position best_positions[MAX_TABLES+1];
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
53
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
54
public:
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
55
  JoinTable *join_tab;
56
  JoinTable **best_ref;
57
  JoinTable **map2table;    /**< mapping between table indexes and JoinTables */
58
  JoinTable *join_tab_save; /**< saved join_tab for subquery reexecution */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
59
60
  Table **table;
61
  Table **all_tables;
62
  /**
63
    The table which has an index that allows to produce the requried ordering.
64
    A special value of 0x1 means that the ordering will be produced by
65
    passing 1st non-const table to filesort(). NULL means no such table exists.
66
  */
67
  Table *sort_by_table;
68
69
  uint32_t tables;        /**< Number of tables in the join */
70
  uint32_t outer_tables;  /**< Number of tables that are not inside semijoin */
71
  uint32_t const_tables;
72
  uint32_t send_group_parts;
73
74
  bool sort_and_group;
75
  bool first_record;
76
  bool full_join;
77
  bool group;
78
  bool no_field_update;
79
  bool do_send_rows;
80
  /**
81
    true when we want to resume nested loop iterations when
82
    fetching data from a cursor
83
  */
84
  bool resume_nested_loop;
85
  /**
86
    true <=> optimizer must not mark any table as a constant table.
87
    This is needed for subqueries in form "a IN (SELECT .. UNION SELECT ..):
88
    when we optimize the select that reads the results of the union from a
89
    temporary table, we must not mark the temp. table as constant because
90
    the number of rows in it may vary from one subquery execution to another.
91
  */
92
  bool no_const_tables;
93
  bool select_distinct;				/**< Set if SELECT DISTINCT */
94
  /**
95
    If we have the GROUP BY statement in the query,
96
    but the group_list was emptied by optimizer, this
97
    flag is true.
98
    It happens when fields in the GROUP BY are from
99
    constant table
100
  */
101
  bool group_optimized_away;
102
103
  /*
104
    simple_xxxxx is set if order_st/GROUP BY doesn't include any references
1541.1.1 by Brian Aker
JOIN -> Join rename
105
    to other tables than the first non-constant table in the Join.
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
106
    It's also set if order_st/GROUP BY is empty.
107
  */
108
  bool simple_order;
109
  bool simple_group;
110
  /**
111
    Is set only in case if we have a GROUP BY clause
1273.2.15 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in drizzled/join.h
112
    and no ORDER BY after constant elimination of 'order'.
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
113
  */
114
  bool no_order;
1273.2.15 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in drizzled/join.h
115
  /** Is set if we have a GROUP BY and we have ORDER BY on a constant. */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
116
  bool skip_sort_order;
117
  bool union_part; /**< this subselect is part of union */
118
  bool optimized; /**< flag to avoid double optimization in EXPLAIN */
119
  bool need_tmp;
120
  bool hidden_group_fields;
121
122
  table_map const_table_map;
123
  table_map found_const_table_map;
124
  table_map outer_join;
125
126
  ha_rows send_records;
127
  ha_rows found_records;
128
  ha_rows examined_rows;
129
  ha_rows row_limit;
130
  ha_rows select_limit;
131
  /**
132
    Used to fetch no more than given amount of rows per one
133
    fetch operation of server side cursor.
134
    The value is checked in end_send and end_send_group in fashion, similar
135
    to offset_limit_cnt:
136
      - fetch_limit= HA_POS_ERROR if there is no cursor.
137
      - when we open a cursor, we set fetch_limit to 0,
138
      - on each fetch iteration we add num_rows to fetch to fetch_limit
139
  */
140
  ha_rows fetch_limit;
141
142
  Session	*session;
143
  List<Item> *fields;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
144
  List<Item> &fields_list; /**< hold field list passed to select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
145
  List<TableList> *join_list; /**< list of joined tables in reverse order */
146
  /** unit structure (with global parameters) for this select */
147
  Select_Lex_Unit *unit;
148
  /** select that processed */
149
  Select_Lex *select_lex;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
150
  optimizer::SqlSelect *select; /**< created in optimization phase */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
151
152
  /**
153
    Bitmap of nested joins embedding the position at the end of the current
154
    partial join (valid only during join optimizer run).
155
  */
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
156
  std::bitset<64> cur_embedding_map;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
157
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
158
  /**
159
   * The cost for the final query execution plan chosen after optimization
160
   * has completed. The QEP is stored in the best_positions variable.
161
   */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
162
  double best_read;
1101.1.16 by Monty Taylor
Reverted 1103
163
  List<Cached_item> group_fields;
164
  List<Cached_item> group_fields_cache;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
165
  Table *tmp_table;
166
  /** used to store 2 possible tmp table of SELECT */
167
  Table *exec_tmp_table1;
168
  Table *exec_tmp_table2;
169
  Item_sum **sum_funcs;
170
  Item_sum ***sum_funcs_end;
171
  /** second copy of sumfuncs (for queries with 2 temporary tables */
172
  Item_sum **sum_funcs2;
173
  Item_sum ***sum_funcs_end2;
174
  Item *having;
175
  Item *tmp_having; /**< To store having when processed temporary table */
176
  Item *having_history; /**< Store having for explain */
177
  uint64_t select_options;
178
  select_result *result;
179
  Tmp_Table_Param tmp_table_param;
1711.6.1 by Brian Aker
Style on structure cleanup
180
  DrizzleLock *lock;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
181
1541.1.1 by Brian Aker
JOIN -> Join rename
182
  Join *tmp_join; /**< copy of this Join to be used with temporary tables */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
183
  ROLLUP rollup;				/**< Used with rollup */
184
  DYNAMIC_ARRAY keyuse;
185
  Item::cond_result cond_value;
186
  Item::cond_result having_value;
187
  List<Item> all_fields; /**< to store all fields that used in query */
188
  /** Above list changed to use temporary table */
189
  List<Item> tmp_all_fields1;
190
  List<Item> tmp_all_fields2;
191
  List<Item> tmp_all_fields3;
192
  /** Part, shared with list above, emulate following list */
193
  List<Item> tmp_fields_list1;
194
  List<Item> tmp_fields_list2;
195
  List<Item> tmp_fields_list3;
196
  int error;
197
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
198
  Order *order;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
199
  Order *group_list; /**< hold parameters of select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
200
  COND *conds;                            // ---"---
201
  Item *conds_history; /**< store WHERE for explain */
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
202
  TableList *tables_list; /**< hold 'tables' parameter of select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
203
  COND_EQUAL *cond_equal;
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
204
  JoinTable *return_tab; /**< used only for outer joins */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
205
  Item **ref_pointer_array; /**< used pointer reference for this select */
206
  /** Copy of above to be used with different lists */
207
  Item **items0;
208
  Item **items1;
209
  Item **items2;
210
  Item **items3;
211
  Item **current_ref_pointer_array;
212
  uint32_t ref_pointer_array_size; ///< size of above in bytes
213
  const char *zero_result_cause; ///< not 0 if exec must return zero result
214
215
  /*
216
    storage for caching buffers allocated during query execution.
217
    These buffers allocations need to be cached as the thread memory pool is
218
    cleared only at the end of the execution of the whole query and not caching
219
    allocations that occur in repetition at execution time will result in
220
    excessive memory usage.
221
  */
1711.6.1 by Brian Aker
Style on structure cleanup
222
  SortField *sortorder;                        // make_unireg_sortorder()
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
223
  Table **table_reexec;                         // make_simple_join()
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
224
  JoinTable *join_tab_reexec;                    // make_simple_join()
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
225
  /* end of allocation caching storage */
226
227
  /** Constructors */
1541.1.1 by Brian Aker
JOIN -> Join rename
228
  Join(Session *session_arg, 
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
229
       List<Item> &fields_arg, 
230
       uint64_t select_options_arg,
231
       select_result *result_arg)
232
    :
233
      join_tab(NULL),
234
      best_ref(NULL),
235
      map2table(NULL),
236
      join_tab_save(NULL),
237
      table(NULL),
238
      all_tables(NULL),
239
      sort_by_table(NULL),
240
      tables(0),
241
      outer_tables(0),
242
      const_tables(0),
243
      send_group_parts(0),
244
      sort_and_group(false),
245
      first_record(false),
246
      full_join(false),
247
      group(false),
248
      no_field_update(false),
249
      do_send_rows(true),
250
      resume_nested_loop(false),
251
      no_const_tables(false),
252
      select_distinct(false),
253
      group_optimized_away(false),
254
      simple_order(false),
255
      simple_group(false),
256
      no_order(false),
257
      skip_sort_order(false),
258
      union_part(false),
259
      optimized(false),
260
      need_tmp(false),
261
      hidden_group_fields(false),
1055.3.1 by Jay Pipes
table_map defined as uint64_t, not pointer type, so change initialization to 0 from NULL.
262
      const_table_map(0),
263
      found_const_table_map(0),
264
      outer_join(0),
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
265
      send_records(0),
266
      found_records(0),
267
      examined_rows(0),
268
      row_limit(0),
269
      select_limit(0),
270
      fetch_limit(HA_POS_ERROR),
271
      session(session_arg),
272
      fields_list(fields_arg), 
273
      join_list(NULL),
274
      unit(NULL),
275
      select_lex(NULL),
276
      select(NULL),
277
      exec_tmp_table1(NULL),
278
      exec_tmp_table2(NULL),
279
      sum_funcs(NULL),
280
      sum_funcs2(NULL),
281
      having(NULL),
282
      tmp_having(NULL),
283
      having_history(NULL),
284
      select_options(select_options_arg),
285
      result(result_arg),
286
      lock(session_arg->lock),
287
      tmp_join(NULL),
288
      all_fields(fields_arg),
289
      error(0),
290
      cond_equal(NULL),
291
      return_tab(NULL),
292
      ref_pointer_array(NULL),
293
      items0(NULL),
294
      items1(NULL),
295
      items2(NULL),
296
      items3(NULL),
297
      ref_pointer_array_size(0),
298
      zero_result_cause(NULL),
299
      sortorder(NULL),
300
      table_reexec(NULL),
301
      join_tab_reexec(NULL)
302
  {
303
    select_distinct= test(select_options & SELECT_DISTINCT);
304
    if (&fields_list != &fields_arg) /* only copy if not same*/
305
      fields_list= fields_arg;
306
    memset(&keyuse, 0, sizeof(keyuse));
1101.1.16 by Monty Taylor
Reverted 1103
307
    tmp_table_param.init();
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
308
    tmp_table_param.end_write_records= HA_POS_ERROR;
309
    rollup.state= ROLLUP::STATE_NONE;
310
  }
311
312
  /** 
313
   * This method is currently only used when a subselect EXPLAIN is performed.
314
   * I pulled out the init() method and have simply reset the values to what
315
   * was previously in the init() method.  See the note about the hack in 
316
   * sql_union.cc...
317
   */
318
  inline void reset(Session *session_arg, 
319
       List<Item> &fields_arg, 
320
       uint64_t select_options_arg,
321
       select_result *result_arg)
322
  {
323
    join_tab= NULL;
324
    best_ref= NULL;
325
    map2table= NULL;
326
    join_tab_save= NULL;
327
    table= NULL;
328
    all_tables= NULL;
329
    sort_by_table= NULL;
330
    tables= 0;
331
    outer_tables= 0;
332
    const_tables= 0;
333
    send_group_parts= 0;
334
    sort_and_group= false;
335
    first_record= false;
336
    full_join= false;
337
    group= false;
338
    no_field_update= false;
339
    do_send_rows= true;
340
    resume_nested_loop= false;
341
    no_const_tables= false;
342
    select_distinct= false;
343
    group_optimized_away= false;
344
    simple_order= false;
345
    simple_group= false;
346
    no_order= false;
347
    skip_sort_order= false;
348
    union_part= false;
349
    optimized= false;
350
    need_tmp= false;
351
    hidden_group_fields= false;
1055.3.1 by Jay Pipes
table_map defined as uint64_t, not pointer type, so change initialization to 0 from NULL.
352
    const_table_map= 0;
353
    found_const_table_map= 0;
354
    outer_join= 0;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
355
    send_records= 0;
356
    found_records= 0;
357
    examined_rows= 0;
358
    row_limit= 0;
359
    select_limit= 0;
360
    fetch_limit= HA_POS_ERROR;
361
    session= session_arg;
362
    fields_list= fields_arg; 
363
    join_list= NULL;
364
    unit= NULL;
365
    select_lex= NULL;
366
    select= NULL;
367
    exec_tmp_table1= NULL;
368
    exec_tmp_table2= NULL;
369
    sum_funcs= NULL;
370
    sum_funcs2= NULL;
371
    having= NULL;
372
    tmp_having= NULL;
373
    having_history= NULL;
374
    select_options= select_options_arg;
375
    result= result_arg;
376
    lock= session_arg->lock;
377
    tmp_join= NULL;
378
    all_fields= fields_arg;
379
    error= 0;
380
    cond_equal= NULL;
381
    return_tab= NULL;
382
    ref_pointer_array= NULL;
383
    items0= NULL;
384
    items1= NULL;
385
    items2= NULL;
386
    items3= NULL;
387
    ref_pointer_array_size= 0;
388
    zero_result_cause= NULL;
389
    sortorder= NULL;
390
    table_reexec= NULL;
391
    join_tab_reexec= NULL;
392
    select_distinct= test(select_options & SELECT_DISTINCT);
393
    if (&fields_list != &fields_arg) /* only copy if not same*/
394
      fields_list= fields_arg;
395
    memset(&keyuse, 0, sizeof(keyuse));
1101.1.16 by Monty Taylor
Reverted 1103
396
    tmp_table_param.init();
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
397
    tmp_table_param.end_write_records= HA_POS_ERROR;
398
    rollup.state= ROLLUP::STATE_NONE;
399
  }
400
401
  int prepare(Item ***rref_pointer_array, 
402
              TableList *tables,
403
              uint32_t wind_num,
404
              COND *conds,
405
              uint32_t og_num,
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
406
              Order *order,
407
              Order *group,
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
408
              Item *having,
409
              Select_Lex *select,
410
              Select_Lex_Unit *unit);
411
  int optimize();
412
  int reinit();
413
  void exec();
414
  int destroy();
415
  void restore_tmp();
416
  bool alloc_func_list();
417
  bool setup_subquery_materialization();
418
  bool make_sum_func_list(List<Item> &all_fields, 
419
                          List<Item> &send_fields,
420
                  			  bool before_group_by,
421
                          bool recompute= false);
422
423
  inline void set_items_ref_array(Item **ptr)
424
  {
425
    memcpy(ref_pointer_array, ptr, ref_pointer_array_size);
426
    current_ref_pointer_array= ptr;
427
  }
428
  inline void init_items_ref_array()
429
  {
430
    items0= ref_pointer_array + all_fields.elements;
431
    memcpy(items0, ref_pointer_array, ref_pointer_array_size);
432
    current_ref_pointer_array= items0;
433
  }
434
435
  bool rollup_init();
436
  bool rollup_make_fields(List<Item> &all_fields, 
437
                          List<Item> &fields,
438
                  			  Item_sum ***func);
439
  int rollup_send_data(uint32_t idx);
440
  int rollup_write_data(uint32_t idx, Table *table);
441
  void remove_subq_pushed_predicates(Item **where);
442
  /**
443
    Release memory and, if possible, the open tables held by this execution
444
    plan (and nested plans). It's used to release some tables before
445
    the end of execution in order to increase concurrency and reduce
446
    memory consumption.
447
  */
448
  void join_free();
1541.1.1 by Brian Aker
JOIN -> Join rename
449
  /** Cleanup this Join, possibly for reuse */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
450
  void cleanup(bool full);
451
  void clear();
452
  bool save_join_tab();
453
  bool init_save_join_tab();
454
  bool send_row_on_empty_set()
455
  {
456
    return (do_send_rows && tmp_table_param.sum_func_count != 0 &&
457
	    !group_list);
458
  }
459
  bool change_result(select_result *result);
460
  bool is_top_level_join() const
461
  {
462
    return (unit == &session->lex->unit && (unit->fake_select_lex == 0 ||
463
                                        select_lex == unit->fake_select_lex));
464
  }
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
465
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
466
  /**
467
   * Copy the partial query plan into the optimal query plan.
468
   *
469
   * @param[in] size the size of the plan which is to be copied
470
   */
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
471
  void copyPartialPlanIntoOptimalPlan(uint32_t size)
472
  {
473
    memcpy(best_positions, positions, 
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
474
           sizeof(optimizer::Position) * size);
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
475
  }
476
1240.8.2 by Dennis Schoen
add cache_const_exprs() to JOIN
477
  void cache_const_exprs();
478
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
479
  /**
480
   * @param[in] index the index of the position to retrieve
481
   * @return a reference to the specified position in the optimal
482
   *         query plan
483
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
484
  optimizer::Position &getPosFromOptimalPlan(uint32_t index)
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
485
  {
486
    return best_positions[index];
487
  }
488
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
489
  /**
490
   * @param[in] index the index of the position to retrieve
491
   * @return a reference to the specified position in the partial
492
   *         query plan
493
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
494
  optimizer::Position &getPosFromPartialPlan(uint32_t index)
1108.6.6 by Padraig O'Sullivan
Adding accessors to the JOIN class for the positions member. The end goal is
495
  {
496
    return positions[index];
497
  }
498
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
499
  /**
500
   * @param[in] index the index of the position to set
501
   * @param[in] in_pos the value to set the position to
502
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
503
  void setPosInPartialPlan(uint32_t index, optimizer::Position &in_pos)
1108.6.6 by Padraig O'Sullivan
Adding accessors to the JOIN class for the positions member. The end goal is
504
  {
1108.6.9 by Padraig O'Sullivan
Cleaned up the method for setting an element in the positions array.
505
    positions[index]= in_pos;
1108.6.6 by Padraig O'Sullivan
Adding accessors to the JOIN class for the positions member. The end goal is
506
  }
507
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
508
  /**
509
   * @return a pointer to the first position in the partial query plan
510
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
511
  optimizer::Position *getFirstPosInPartialPlan()
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
512
  {
513
    return positions;
514
  }
515
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
516
  /**
517
   * @param[in] index the index of the operator to retrieve from the partial
518
   *                  query plan
519
   * @return a pointer to the position in the partial query plan
520
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
521
  optimizer::Position *getSpecificPosInPartialPlan(int32_t index)
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
522
  {
523
    return positions + index;
524
  }
525
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
526
};
527
1541.1.1 by Brian Aker
JOIN -> Join rename
528
enum_nested_loop_state evaluate_join_record(Join *join, JoinTable *join_tab, int error);
529
enum_nested_loop_state evaluate_null_complemented_join_record(Join *join, JoinTable *join_tab);
530
enum_nested_loop_state flush_cached_records(Join *join, JoinTable *join_tab, bool skip_last);
531
enum_nested_loop_state end_send(Join *join, JoinTable *join_tab, bool end_of_records);
532
enum_nested_loop_state end_write(Join *join, JoinTable *join_tab, bool end_of_records);
533
enum_nested_loop_state end_update(Join *join, JoinTable *join_tab, bool end_of_records);
534
enum_nested_loop_state end_unique_update(Join *join, JoinTable *join_tab, bool end_of_records);
1039.2.2 by Jay Pipes
Phase 2 of JOIN refactoring.
535
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
536
} /* namespace drizzled */
537
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
538
#endif /* DRIZZLED_JOIN_H */