~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
2234 by Brian Aker
Mass removal of ifdef/endif in favor of pragma once.
27
#pragma once
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
28
2221.7.4 by Olaf van der Spek
Refactor
29
#include <drizzled/dynamic_array.h>
1108.6.29 by Padraig O'Sullivan
Added an optimizer namespace and sub-directory within drizzled. Moved the
30
#include <drizzled/optimizer/position.h>
2154.2.7 by Brian Aker
class Join constructor moved out.
31
#include <drizzled/sql_select.h>
2154.2.17 by Brian Aker
Additional removal of session
32
#include <drizzled/tmp_table_param.h>
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
33
#include <bitset>
34
2252.1.14 by Olaf van der Spek
Common fwd
35
namespace drizzled {
2154.2.7 by Brian Aker
class Join constructor moved out.
36
2318.6.43 by Olaf van der Spek
Refactor
37
class Join : public memory::SqlAlloc, boost::noncopyable
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
38
{
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
39
  /**
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
40
   * Contains a partial query execution plan which is extended during
41
   * cost-based optimization.
42
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
43
  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
44
45
  /**
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
46
   * Contains the optimal query execution plan after cost-based optimization
47
   * has taken place. 
48
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
49
  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
50
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
51
public:
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
52
  JoinTable *join_tab;
53
  JoinTable **best_ref;
54
  JoinTable **map2table;    /**< mapping between table indexes and JoinTables */
55
  JoinTable *join_tab_save; /**< saved join_tab for subquery reexecution */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
56
57
  Table **table;
58
  Table **all_tables;
59
  /**
60
    The table which has an index that allows to produce the requried ordering.
61
    A special value of 0x1 means that the ordering will be produced by
62
    passing 1st non-const table to filesort(). NULL means no such table exists.
63
  */
64
  Table *sort_by_table;
65
66
  uint32_t tables;        /**< Number of tables in the join */
67
  uint32_t outer_tables;  /**< Number of tables that are not inside semijoin */
68
  uint32_t const_tables;
69
  uint32_t send_group_parts;
70
71
  bool sort_and_group;
72
  bool first_record;
73
  bool full_join;
74
  bool group;
75
  bool no_field_update;
76
  bool do_send_rows;
77
  /**
78
    true when we want to resume nested loop iterations when
79
    fetching data from a cursor
80
  */
81
  bool resume_nested_loop;
82
  /**
83
    true <=> optimizer must not mark any table as a constant table.
84
    This is needed for subqueries in form "a IN (SELECT .. UNION SELECT ..):
85
    when we optimize the select that reads the results of the union from a
86
    temporary table, we must not mark the temp. table as constant because
87
    the number of rows in it may vary from one subquery execution to another.
88
  */
89
  bool no_const_tables;
90
  bool select_distinct;				/**< Set if SELECT DISTINCT */
91
  /**
92
    If we have the GROUP BY statement in the query,
93
    but the group_list was emptied by optimizer, this
94
    flag is true.
95
    It happens when fields in the GROUP BY are from
96
    constant table
97
  */
98
  bool group_optimized_away;
99
100
  /*
101
    simple_xxxxx is set if order_st/GROUP BY doesn't include any references
1541.1.1 by Brian Aker
JOIN -> Join rename
102
    to other tables than the first non-constant table in the Join.
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
103
    It's also set if order_st/GROUP BY is empty.
104
  */
105
  bool simple_order;
106
  bool simple_group;
107
  /**
108
    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
109
    and no ORDER BY after constant elimination of 'order'.
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
110
  */
111
  bool no_order;
1273.2.15 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in drizzled/join.h
112
  /** 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:
113
  bool skip_sort_order;
114
  bool union_part; /**< this subselect is part of union */
115
  bool optimized; /**< flag to avoid double optimization in EXPLAIN */
116
  bool need_tmp;
117
  bool hidden_group_fields;
118
119
  table_map const_table_map;
120
  table_map found_const_table_map;
121
  table_map outer_join;
122
123
  ha_rows send_records;
124
  ha_rows found_records;
125
  ha_rows examined_rows;
126
  ha_rows row_limit;
127
  ha_rows select_limit;
128
  /**
129
    Used to fetch no more than given amount of rows per one
130
    fetch operation of server side cursor.
131
    The value is checked in end_send and end_send_group in fashion, similar
132
    to offset_limit_cnt:
133
      - fetch_limit= HA_POS_ERROR if there is no cursor.
134
      - when we open a cursor, we set fetch_limit to 0,
135
      - on each fetch iteration we add num_rows to fetch to fetch_limit
136
  */
137
  ha_rows fetch_limit;
138
139
  Session	*session;
140
  List<Item> *fields;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
141
  List<Item> &fields_list; /**< hold field list passed to select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
142
  List<TableList> *join_list; /**< list of joined tables in reverse order */
143
  /** unit structure (with global parameters) for this select */
144
  Select_Lex_Unit *unit;
145
  /** select that processed */
146
  Select_Lex *select_lex;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
147
  optimizer::SqlSelect *select; /**< created in optimization phase */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
148
149
  /**
150
    Bitmap of nested joins embedding the position at the end of the current
151
    partial join (valid only during join optimizer run).
152
  */
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
153
  std::bitset<64> cur_embedding_map;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
154
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
155
  /**
156
   * The cost for the final query execution plan chosen after optimization
157
   * has completed. The QEP is stored in the best_positions variable.
158
   */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
159
  double best_read;
1101.1.16 by Monty Taylor
Reverted 1103
160
  List<Cached_item> group_fields;
161
  List<Cached_item> group_fields_cache;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
162
  Table *tmp_table;
163
  /** used to store 2 possible tmp table of SELECT */
164
  Table *exec_tmp_table1;
165
  Table *exec_tmp_table2;
166
  Item_sum **sum_funcs;
167
  Item_sum ***sum_funcs_end;
168
  /** second copy of sumfuncs (for queries with 2 temporary tables */
169
  Item_sum **sum_funcs2;
170
  Item_sum ***sum_funcs_end2;
171
  Item *having;
172
  Item *tmp_having; /**< To store having when processed temporary table */
173
  Item *having_history; /**< Store having for explain */
174
  uint64_t select_options;
175
  select_result *result;
176
  Tmp_Table_Param tmp_table_param;
1711.6.1 by Brian Aker
Style on structure cleanup
177
  DrizzleLock *lock;
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
178
1541.1.1 by Brian Aker
JOIN -> Join rename
179
  Join *tmp_join; /**< copy of this Join to be used with temporary tables */
2082.3.1 by vjsamuel1990 at gmail
Merge conversion of ROLLUP from struct to class.
180
  Rollup rollup;				/**< Used with rollup */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
181
  DYNAMIC_ARRAY keyuse;
182
  Item::cond_result cond_value;
183
  Item::cond_result having_value;
184
  List<Item> all_fields; /**< to store all fields that used in query */
185
  /** Above list changed to use temporary table */
186
  List<Item> tmp_all_fields1;
187
  List<Item> tmp_all_fields2;
188
  List<Item> tmp_all_fields3;
189
  /** Part, shared with list above, emulate following list */
190
  List<Item> tmp_fields_list1;
191
  List<Item> tmp_fields_list2;
192
  List<Item> tmp_fields_list3;
193
  int error;
194
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
195
  Order *order;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
196
  Order *group_list; /**< hold parameters of select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
197
  COND *conds;                            // ---"---
198
  Item *conds_history; /**< store WHERE for explain */
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
199
  TableList *tables_list; /**< hold 'tables' parameter of select_query */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
200
  COND_EQUAL *cond_equal;
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
201
  JoinTable *return_tab; /**< used only for outer joins */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
202
  Item **ref_pointer_array; /**< used pointer reference for this select */
203
  /** Copy of above to be used with different lists */
204
  Item **items0;
205
  Item **items1;
206
  Item **items2;
207
  Item **items3;
208
  Item **current_ref_pointer_array;
209
  uint32_t ref_pointer_array_size; ///< size of above in bytes
210
  const char *zero_result_cause; ///< not 0 if exec must return zero result
211
212
  /*
213
    storage for caching buffers allocated during query execution.
214
    These buffers allocations need to be cached as the thread memory pool is
215
    cleared only at the end of the execution of the whole query and not caching
216
    allocations that occur in repetition at execution time will result in
217
    excessive memory usage.
218
  */
1711.6.1 by Brian Aker
Style on structure cleanup
219
  SortField *sortorder;                        // make_unireg_sortorder()
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
220
  Table **table_reexec;                         // make_simple_join()
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
221
  JoinTable *join_tab_reexec;                    // make_simple_join()
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
222
  /* end of allocation caching storage */
223
224
  /** Constructors */
1541.1.1 by Brian Aker
JOIN -> Join rename
225
  Join(Session *session_arg, 
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
226
       List<Item> &fields_arg, 
227
       uint64_t select_options_arg,
2154.2.7 by Brian Aker
class Join constructor moved out.
228
       select_result *result_arg);
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
229
230
  /** 
231
   * This method is currently only used when a subselect EXPLAIN is performed.
232
   * I pulled out the init() method and have simply reset the values to what
233
   * was previously in the init() method.  See the note about the hack in 
234
   * sql_union.cc...
235
   */
2154.2.7 by Brian Aker
class Join constructor moved out.
236
  void reset(Session *session_arg, 
237
             List<Item> &fields_arg, 
238
             uint64_t select_options_arg,
239
             select_result *result_arg);
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
240
241
  int prepare(Item ***rref_pointer_array, 
242
              TableList *tables,
243
              uint32_t wind_num,
244
              COND *conds,
245
              uint32_t og_num,
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
246
              Order *order,
247
              Order *group,
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
248
              Item *having,
249
              Select_Lex *select,
250
              Select_Lex_Unit *unit);
2154.2.7 by Brian Aker
class Join constructor moved out.
251
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
252
  int optimize();
253
  int reinit();
254
  void exec();
255
  int destroy();
256
  void restore_tmp();
257
  bool alloc_func_list();
258
  bool setup_subquery_materialization();
259
  bool make_sum_func_list(List<Item> &all_fields, 
260
                          List<Item> &send_fields,
261
                  			  bool before_group_by,
262
                          bool recompute= false);
263
264
  inline void set_items_ref_array(Item **ptr)
265
  {
266
    memcpy(ref_pointer_array, ptr, ref_pointer_array_size);
267
    current_ref_pointer_array= ptr;
268
  }
269
  inline void init_items_ref_array()
270
  {
2183.2.17 by Olaf van der Spek
Use List::size()
271
    items0= ref_pointer_array + all_fields.size();
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
272
    memcpy(items0, ref_pointer_array, ref_pointer_array_size);
273
    current_ref_pointer_array= items0;
274
  }
275
276
  bool rollup_init();
277
  bool rollup_make_fields(List<Item> &all_fields, 
278
                          List<Item> &fields,
279
                  			  Item_sum ***func);
280
  int rollup_send_data(uint32_t idx);
281
  int rollup_write_data(uint32_t idx, Table *table);
282
  void remove_subq_pushed_predicates(Item **where);
283
  /**
284
    Release memory and, if possible, the open tables held by this execution
285
    plan (and nested plans). It's used to release some tables before
286
    the end of execution in order to increase concurrency and reduce
287
    memory consumption.
288
  */
289
  void join_free();
1541.1.1 by Brian Aker
JOIN -> Join rename
290
  /** Cleanup this Join, possibly for reuse */
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
291
  void cleanup(bool full);
292
  void clear();
2318.6.25 by Olaf van der Spek
Refactor
293
  void save_join_tab();
294
  void init_save_join_tab();
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
295
  bool send_row_on_empty_set()
296
  {
297
    return (do_send_rows && tmp_table_param.sum_func_count != 0 &&
298
	    !group_list);
299
  }
300
  bool change_result(select_result *result);
2154.2.7 by Brian Aker
class Join constructor moved out.
301
  bool is_top_level_join() const;
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
302
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
303
  /**
304
   * Copy the partial query plan into the optimal query plan.
305
   *
306
   * @param[in] size the size of the plan which is to be copied
307
   */
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
308
  void copyPartialPlanIntoOptimalPlan(uint32_t size)
309
  {
310
    memcpy(best_positions, positions, 
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
311
           sizeof(optimizer::Position) * size);
1108.6.4 by Padraig O'Sullivan
Made the best_positions member of the JOIN class private and added any
312
  }
313
1240.8.2 by Dennis Schoen
add cache_const_exprs() to JOIN
314
  void cache_const_exprs();
315
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
316
  /**
317
   * @param[in] index the index of the position to retrieve
318
   * @return a reference to the specified position in the optimal
319
   *         query plan
320
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
321
  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
322
  {
323
    return best_positions[index];
324
  }
325
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
326
  /**
327
   * @param[in] index the index of the position to retrieve
328
   * @return a reference to the specified position in the partial
329
   *         query plan
330
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
331
  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
332
  {
333
    return positions[index];
334
  }
335
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
336
  /**
337
   * @param[in] index the index of the position to set
338
   * @param[in] in_pos the value to set the position to
339
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
340
  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
341
  {
1108.6.9 by Padraig O'Sullivan
Cleaned up the method for setting an element in the positions array.
342
    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
343
  }
344
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
345
  /**
346
   * @return a pointer to the first position in the partial query plan
347
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
348
  optimizer::Position *getFirstPosInPartialPlan()
1108.6.8 by Padraig O'Sullivan
Made the positions member of the JOIN class private (finally got that
349
  {
350
    return positions;
351
  }
352
1108.6.11 by Padraig O'Sullivan
Added some doxygen comments to the new methods added to the JOIN class.
353
  /**
354
   * @param[in] index the index of the operator to retrieve from the partial
355
   *                  query plan
356
   * @return a pointer to the position in the partial query plan
357
   */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
358
  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
359
  {
360
    return positions + index;
361
  }
362
1039.2.1 by Jay Pipes
First phase refactoring the JOIN class:
363
};
364
1541.1.1 by Brian Aker
JOIN -> Join rename
365
enum_nested_loop_state evaluate_join_record(Join *join, JoinTable *join_tab, int error);
366
enum_nested_loop_state evaluate_null_complemented_join_record(Join *join, JoinTable *join_tab);
367
enum_nested_loop_state flush_cached_records(Join *join, JoinTable *join_tab, bool skip_last);
368
enum_nested_loop_state end_send(Join *join, JoinTable *join_tab, bool end_of_records);
369
enum_nested_loop_state end_write(Join *join, JoinTable *join_tab, bool end_of_records);
370
enum_nested_loop_state end_update(Join *join, JoinTable *join_tab, bool end_of_records);
371
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.
372
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
373
} /* namespace drizzled */
374