~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
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; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
1 by brian
clean slate
19
20
/**
21
  @file
22
23
  @brief
24
  classes to use when handling where clause
25
*/
26
27
243.1.13 by Jay Pipes
More comments in mysql_priv.h to mark stuff TODO. Move sql_locale.h and object_creation_ctx.h up in the file since no more dependencies above them.
28
/* PREV_BITS only used in sql_select.cc */
29
#define PREV_BITS(type,A)	((type) (((type) 1 << (A)) -1))
30
212.4.2 by Monty Taylor
Fixed the includes in places to make the myisam header file move work.
31
#include <storage/myisam/myisam.h>
1 by brian
clean slate
32
33
/* Values in optimize */
34
#define KEY_OPTIMIZE_EXISTS		1
35
#define KEY_OPTIMIZE_REF_OR_NULL	2
36
37
typedef struct keyuse_t {
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
38
  Table *table;
1 by brian
clean slate
39
  Item	*val;				/**< or value if no field */
40
  table_map used_tables;
41
  uint	key, keypart;
482 by Brian Aker
Remove uint.
42
  uint32_t optimize; // 0, or KEY_OPTIMIZE_*
1 by brian
clean slate
43
  key_part_map keypart_map;
44
  ha_rows      ref_table_rows;
45
  /**
46
    If true, the comparison this value was created from will not be
47
    satisfied if val has NULL 'value'.
48
  */
49
  bool null_rejecting;
50
  /*
51
    !NULL - This KEYUSE was created from an equality that was wrapped into
52
            an Item_func_trig_cond. This means the equality (and validity of 
53
            this KEYUSE element) can be turned on and off. The on/off state 
54
            is indicted by the pointed value:
51.1.67 by Jay Pipes
standardized TRUE/FALSE
55
              *cond_guard == true <=> equality condition is on
56
              *cond_guard == false <=> equality condition is off
1 by brian
clean slate
57
58
    NULL  - Otherwise (the source equality can't be turned off)
59
  */
60
  bool *cond_guard;
61
  /*
62
     0..64    <=> This was created from semi-join IN-equality # sj_pred_no.
63
     MAX_UINT  Otherwise
64
  */
482 by Brian Aker
Remove uint.
65
  uint32_t         sj_pred_no;
1 by brian
clean slate
66
} KEYUSE;
67
68
class store_key;
69
70
typedef struct st_table_ref
71
{
72
  bool		key_err;
365.2.6 by Monty Taylor
Undid some stupid int->int16_t conversions.
73
  uint32_t      key_parts;                ///< num of ...
74
  uint32_t      key_length;               ///< length of key_buff
75
  int32_t       key;                      ///< key no
365.2.5 by Monty Taylor
More ~0 removal.
76
  unsigned char *key_buff;                ///< value to look for with key
77
  unsigned char *key_buff2;               ///< key_buff+key_length
1 by brian
clean slate
78
  store_key     **key_copy;               //
79
  Item          **items;                  ///< val()'s for each keypart
80
  /*  
81
    Array of pointers to trigger variables. Some/all of the pointers may be
82
    NULL.  The ref access can be used iff
83
    
84
      for each used key part i, (!cond_guards[i] || *cond_guards[i]) 
85
86
    This array is used by subquery code. The subquery code may inject
87
    triggered conditions, i.e. conditions that can be 'switched off'. A ref 
88
    access created from such condition is not valid when at least one of the 
89
    underlying conditions is switched off (see subquery code for more details)
90
  */
91
  bool          **cond_guards;
92
  /**
93
    (null_rejecting & (1<<i)) means the condition is '=' and no matching
94
    rows will be produced if items[i] IS NULL (see add_not_null_conds())
95
  */
96
  key_part_map  null_rejecting;
97
  table_map	depend_map;		  ///< Table depends on these tables.
98
  /* null byte position in the key_buf. Used for REF_OR_NULL optimization */
365.2.5 by Monty Taylor
More ~0 removal.
99
  unsigned char *null_ref_key;
1 by brian
clean slate
100
101
  /*
51.1.67 by Jay Pipes
standardized TRUE/FALSE
102
    true <=> disable the "cache" as doing lookup with the same key value may
1 by brian
clean slate
103
    produce different results (because of Index Condition Pushdown)
104
  */
105
  bool          disable_cache;
106
} TABLE_REF;
107
108
109
/**
110
  CACHE_FIELD and JOIN_CACHE is used on full join to cache records in outer
111
  table
112
*/
113
114
typedef struct st_cache_field {
115
  /* 
116
    Where source data is located (i.e. this points to somewhere in 
117
    tableX->record[0])
118
  */
365.2.5 by Monty Taylor
More ~0 removal.
119
  unsigned char *str;
365.2.6 by Monty Taylor
Undid some stupid int->int16_t conversions.
120
  uint32_t length; /* Length of data at *str, in bytes */
121
  uint32_t blob_length; /* Valid IFF blob_field != 0 */
1 by brian
clean slate
122
  Field_blob *blob_field;
51.1.67 by Jay Pipes
standardized TRUE/FALSE
123
  bool strip; /* true <=> Strip endspaces ?? */
1 by brian
clean slate
124
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
125
  Table *get_rowid; /* _ != NULL <=> */
1 by brian
clean slate
126
} CACHE_FIELD;
127
128
129
typedef struct st_join_cache 
130
{
365.2.5 by Monty Taylor
More ~0 removal.
131
  unsigned char *buff;
132
  unsigned char *pos;    /* Start of free space in the buffer */
133
  unsigned char *end;
365.2.6 by Monty Taylor
Undid some stupid int->int16_t conversions.
134
  uint32_t records;  /* # of row cominations currently stored in the cache */
135
  uint32_t record_nr;
136
  uint32_t ptr_record; 
1 by brian
clean slate
137
  /* 
138
    Number of fields (i.e. cache_field objects). Those correspond to table
139
    columns, and there are also special fields for
140
     - table's column null bits
141
     - table's null-complementation byte
142
     - [new] table's rowid.
143
  */
365.2.6 by Monty Taylor
Undid some stupid int->int16_t conversions.
144
  uint32_t fields; 
145
  uint32_t length; 
146
  uint32_t blobs;
1 by brian
clean slate
147
  CACHE_FIELD *field;
148
  CACHE_FIELD **blob_ptr;
149
  SQL_SELECT *select;
150
} JOIN_CACHE;
151
152
153
/*
154
  The structs which holds the join connections and join states
155
*/
156
enum join_type { JT_UNKNOWN,JT_SYSTEM,JT_CONST,JT_EQ_REF,JT_REF,JT_MAYBE_REF,
157
		 JT_ALL, JT_RANGE, JT_NEXT, JT_REF_OR_NULL,
158
		 JT_UNIQUE_SUBQUERY, JT_INDEX_SUBQUERY, JT_INDEX_MERGE};
159
160
class JOIN;
161
162
enum enum_nested_loop_state
163
{
164
  NESTED_LOOP_KILLED= -2, NESTED_LOOP_ERROR= -1,
165
  NESTED_LOOP_OK= 0, NESTED_LOOP_NO_MORE_ROWS= 1,
166
  NESTED_LOOP_QUERY_LIMIT= 3, NESTED_LOOP_CURSOR_LIMIT= 4
167
};
168
169
170
/* Values for JOIN_TAB::packed_info */
171
#define TAB_INFO_HAVE_VALUE 1
172
#define TAB_INFO_USING_INDEX 2
173
#define TAB_INFO_USING_WHERE 4
174
#define TAB_INFO_FULL_SCAN_ON_NULL 8
175
176
class SJ_TMP_TABLE;
177
178
typedef enum_nested_loop_state
179
(*Next_select_func)(JOIN *, struct st_join_table *, bool);
180
typedef int (*Read_record_func)(struct st_join_table *tab);
181
Next_select_func setup_end_select_func(JOIN *join);
182
183
184
typedef struct st_join_table {
185
  st_join_table() {}                          /* Remove gcc warning */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
186
  Table		*table;
1 by brian
clean slate
187
  KEYUSE	*keyuse;			/**< pointer to first used key */
188
  SQL_SELECT	*select;
189
  COND		*select_cond;
190
  QUICK_SELECT_I *quick;
191
  /* 
192
    The value of select_cond before we've attempted to do Index Condition
193
    Pushdown. We may need to restore everything back if we first choose one
194
    index but then reconsider (see test_if_skip_sort_order() for such
195
    scenarios).
196
    NULL means no index condition pushdown was performed.
197
  */
198
  Item          *pre_idx_push_select_cond;
199
  Item	       **on_expr_ref;   /**< pointer to the associated on expression   */
200
  COND_EQUAL    *cond_equal;    /**< multiple equalities for the on expression */
201
  st_join_table *first_inner;   /**< first inner table for including outerjoin */
202
  bool           found;         /**< true after all matches or null complement */
203
  bool           not_null_compl;/**< true before null complement is added      */
204
  st_join_table *last_inner;    /**< last table table for embedding outer join */
205
  st_join_table *first_upper;  /**< first inner table for embedding outer join */
206
  st_join_table *first_unmatched; /**< used for optimization purposes only     */
207
  
208
  /* Special content for EXPLAIN 'Extra' column or NULL if none */
209
  const char	*info;
210
  /* 
211
    Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
212
    column, or 0 if there is no info.
213
  */
482 by Brian Aker
Remove uint.
214
  uint32_t          packed_info;
1 by brian
clean slate
215
216
  Read_record_func read_first_record;
217
  Next_select_func next_select;
218
  READ_RECORD	read_record;
219
  /* 
220
    Currently the following two fields are used only for a [NOT] IN subquery
221
    if it is executed by an alternative full table scan when the left operand of
222
    the subquery predicate is evaluated to NULL.
223
  */  
224
  Read_record_func save_read_first_record;/* to save read_first_record */ 
225
  int (*save_read_record) (READ_RECORD *);/* to save read_record.read_record */
226
  double	worst_seeks;
227
  key_map	const_keys;			/**< Keys with constant part */
228
  key_map	checked_keys;			/**< Keys checked in find_best */
229
  key_map	needed_reg;
230
  key_map       keys;                           /**< all keys with can be used */
231
232
  /* Either #rows in the table or 1 for const table.  */
233
  ha_rows	records;
234
  /*
235
    Number of records that will be scanned (yes scanned, not returned) by the
236
    best 'independent' access method, i.e. table scan or QUICK_*_SELECT)
237
  */
238
  ha_rows       found_records;
239
  /*
240
    Cost of accessing the table using "ALL" or range/index_merge access
241
    method (but not 'index' for some reason), i.e. this matches method which
242
    E(#records) is in found_records.
243
  */
244
  ha_rows       read_time;
245
  
246
  table_map	dependent,key_dependent;
247
  uint		use_quick,index;
248
  uint		status;				///< Save status for cache
249
  uint		used_fields,used_fieldlength,used_blobs;
250
  enum join_type type;
251
  bool		cached_eq_ref_table,eq_ref_table,not_used_in_distinct;
51.1.67 by Jay Pipes
standardized TRUE/FALSE
252
  /* true <=> index-based access method must return records in order */
1 by brian
clean slate
253
  bool		sorted;
254
  /* 
255
    If it's not 0 the number stored this field indicates that the index
256
    scan has been chosen to access the table data and we expect to scan 
257
    this number of rows for the table.
258
  */ 
259
  ha_rows       limit; 
260
  TABLE_REF	ref;
261
  JOIN_CACHE	cache;
262
  JOIN		*join;
263
  /** Bitmap of nested joins this table is part of */
264
265
  /* SemiJoinDuplicateElimination variables: */
266
  /*
267
    Embedding SJ-nest (may be not the direct parent), or NULL if none.
268
    This variable holds the result of table pullout.
269
  */
327.2.4 by Brian Aker
Refactoring table.h
270
  TableList    *emb_sj_nest;
1 by brian
clean slate
271
272
  /* Variables for semi-join duplicate elimination */
273
  SJ_TMP_TABLE  *flush_weedout_table;
274
  SJ_TMP_TABLE  *check_weed_out_table;
275
  struct st_join_table  *do_firstmatch;
276
 
277
  /* 
278
     ptr  - this join tab should do an InsideOut scan. Points 
279
            to the tab for which we'll need to check tab->found_match.
280
281
     NULL - Not an insideout scan.
282
  */
283
  struct st_join_table *insideout_match_tab;
481 by Brian Aker
Remove all of uchar.
284
  unsigned char *insideout_buf; // Buffer to save index tuple to be able to skip dups
1 by brian
clean slate
285
286
  /* Used by InsideOut scan. Just set to true when have found a row. */
287
  bool found_match;
288
289
  enum { 
290
    /* If set, the rowid of this table must be put into the temptable. */
291
    KEEP_ROWID=1, 
292
    /* 
293
      If set, one should call h->position() to obtain the rowid,
294
      otherwise, the rowid is assumed to already be in h->ref
295
      (this is because join caching and filesort() save the rowid and then
296
      put it back into h->ref)
297
    */
298
    CALL_POSITION=2
299
  };
300
  /* A set of flags from the above enum */
301
  int  rowid_keep_flags;
302
303
304
  /* NestedOuterJoins: Bitmap of nested joins this table is part of */
305
  nested_join_map embedding_map;
306
307
  void cleanup();
308
  inline bool is_using_loose_index_scan()
309
  {
310
    return (select && select->quick &&
311
            (select->quick->get_type() ==
312
             QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX));
313
  }
314
} JOIN_TAB;
315
316
enum_nested_loop_state sub_select_cache(JOIN *join, JOIN_TAB *join_tab, bool
317
                                        end_of_records);
318
enum_nested_loop_state sub_select(JOIN *join,JOIN_TAB *join_tab, bool
319
                                  end_of_records);
320
enum_nested_loop_state end_send_group(JOIN *join, JOIN_TAB *join_tab,
321
                                      bool end_of_records);
322
enum_nested_loop_state end_write_group(JOIN *join, JOIN_TAB *join_tab,
323
                                       bool end_of_records);
324
325
/**
326
  Information about a position of table within a join order. Used in join
327
  optimization.
328
*/
329
typedef struct st_position
330
{
331
  /*
332
    The "fanout": number of output rows that will be produced (after
333
    pushed down selection condition is applied) per each row combination of
334
    previous tables.
335
  */
336
  double records_read;
337
338
  /* 
339
    Cost accessing the table in course of the entire complete join execution,
340
    i.e. cost of one access method use (e.g. 'range' or 'ref' scan ) times 
341
    number the access method will be invoked.
342
  */
343
  double read_time;
344
  JOIN_TAB *table;
345
346
  /*
347
    NULL  -  'index' or 'range' or 'index_merge' or 'ALL' access is used.
348
    Other - [eq_]ref[_or_null] access is used. Pointer to {t.keypart1 = expr}
349
  */
350
  KEYUSE *key;
351
352
  /* If ref-based access is used: bitmap of tables this table depends on  */
353
  table_map ref_depend_map;
354
355
  bool use_insideout_scan;
356
} POSITION;
357
358
359
typedef struct st_rollup
360
{
361
  enum State { STATE_NONE, STATE_INITED, STATE_READY };
362
  State state;
363
  Item_null_result **null_items;
364
  Item ***ref_pointer_arrays;
365
  List<Item> *fields;
366
} ROLLUP;
367
368
369
class JOIN :public Sql_alloc
370
{
371
  JOIN(const JOIN &rhs);                        /**< not implemented */
372
  JOIN& operator=(const JOIN &rhs);             /**< not implemented */
373
public:
374
  JOIN_TAB *join_tab,**best_ref;
375
  JOIN_TAB **map2table;    ///< mapping between table indexes and JOIN_TABs
376
  JOIN_TAB *join_tab_save; ///< saved join_tab for subquery reexecution
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
377
  Table    **table,**all_tables;
1 by brian
clean slate
378
  /**
379
    The table which has an index that allows to produce the requried ordering.
380
    A special value of 0x1 means that the ordering will be produced by
381
    passing 1st non-const table to filesort(). NULL means no such table exists.
382
  */
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
383
  Table    *sort_by_table;
1 by brian
clean slate
384
  uint	   tables;        /**< Number of tables in the join */
482 by Brian Aker
Remove uint.
385
  uint32_t     outer_tables;  /**< Number of tables that are not inside semijoin */
386
  uint32_t     const_tables;
1 by brian
clean slate
387
  uint	   send_group_parts;
388
  bool	   sort_and_group,first_record,full_join,group, no_field_update;
389
  bool	   do_send_rows;
390
  /**
51.1.67 by Jay Pipes
standardized TRUE/FALSE
391
    true when we want to resume nested loop iterations when
1 by brian
clean slate
392
    fetching data from a cursor
393
  */
394
  bool     resume_nested_loop;
395
  table_map const_table_map,found_const_table_map,outer_join;
396
  ha_rows  send_records,found_records,examined_rows,row_limit, select_limit;
397
  /**
398
    Used to fetch no more than given amount of rows per one
399
    fetch operation of server side cursor.
400
    The value is checked in end_send and end_send_group in fashion, similar
401
    to offset_limit_cnt:
402
      - fetch_limit= HA_POS_ERROR if there is no cursor.
403
      - when we open a cursor, we set fetch_limit to 0,
404
      - on each fetch iteration we add num_rows to fetch to fetch_limit
405
  */
406
  ha_rows  fetch_limit;
407
  POSITION positions[MAX_TABLES+1],best_positions[MAX_TABLES+1];
408
  
409
  /* *
410
    Bitmap of nested joins embedding the position at the end of the current 
411
    partial join (valid only during join optimizer run).
412
  */
413
  nested_join_map cur_embedding_map;
414
415
  double   best_read;
416
  List<Item> *fields;
417
  List<Cached_item> group_fields, group_fields_cache;
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
418
  Table    *tmp_table;
1 by brian
clean slate
419
  /// used to store 2 possible tmp table of SELECT
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
420
  Table    *exec_tmp_table1, *exec_tmp_table2;
520.1.22 by Brian Aker
Second pass of thd cleanup
421
  Session	   *session;
1 by brian
clean slate
422
  Item_sum  **sum_funcs, ***sum_funcs_end;
423
  /** second copy of sumfuncs (for queries with 2 temporary tables */
424
  Item_sum  **sum_funcs2, ***sum_funcs_end2;
425
  Item	    *having;
426
  Item      *tmp_having; ///< To store having when processed temporary table
427
  Item      *having_history; ///< Store having for explain
151 by Brian Aker
Ulonglong to uint64_t
428
  uint64_t  select_options;
1 by brian
clean slate
429
  select_result *result;
430
  TMP_TABLE_PARAM tmp_table_param;
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
431
  DRIZZLE_LOCK *lock;
1 by brian
clean slate
432
  /// unit structure (with global parameters) for this select
433
  SELECT_LEX_UNIT *unit;
434
  /// select that processed
435
  SELECT_LEX *select_lex;
436
  /** 
51.1.67 by Jay Pipes
standardized TRUE/FALSE
437
    true <=> optimizer must not mark any table as a constant table.
1 by brian
clean slate
438
    This is needed for subqueries in form "a IN (SELECT .. UNION SELECT ..):
439
    when we optimize the select that reads the results of the union from a
440
    temporary table, we must not mark the temp. table as constant because
441
    the number of rows in it may vary from one subquery execution to another.
442
  */
443
  bool no_const_tables; 
444
  
445
  JOIN *tmp_join; ///< copy of this JOIN to be used with temporary tables
446
  ROLLUP rollup;				///< Used with rollup
447
448
  bool select_distinct;				///< Set if SELECT DISTINCT
449
  /**
450
    If we have the GROUP BY statement in the query,
451
    but the group_list was emptied by optimizer, this
51.1.67 by Jay Pipes
standardized TRUE/FALSE
452
    flag is true.
1 by brian
clean slate
453
    It happens when fields in the GROUP BY are from
454
    constant table
455
  */
456
  bool group_optimized_away;
457
458
  /*
327.2.3 by Brian Aker
Refactoring of class Table
459
    simple_xxxxx is set if order_st/GROUP BY doesn't include any references
1 by brian
clean slate
460
    to other tables than the first non-constant table in the JOIN.
327.2.3 by Brian Aker
Refactoring of class Table
461
    It's also set if order_st/GROUP BY is empty.
1 by brian
clean slate
462
  */
463
  bool simple_order, simple_group;
464
  /**
465
    Is set only in case if we have a GROUP BY clause
327.2.3 by Brian Aker
Refactoring of class Table
466
    and no order_st BY after constant elimination of 'order'.
1 by brian
clean slate
467
  */
468
  bool no_order;
327.2.3 by Brian Aker
Refactoring of class Table
469
  /** Is set if we have a GROUP BY and we have order_st BY on a constant. */
1 by brian
clean slate
470
  bool          skip_sort_order;
471
472
  bool need_tmp, hidden_group_fields;
473
  DYNAMIC_ARRAY keyuse;
474
  Item::cond_result cond_value, having_value;
475
  List<Item> all_fields; ///< to store all fields that used in query
476
  ///Above list changed to use temporary table
477
  List<Item> tmp_all_fields1, tmp_all_fields2, tmp_all_fields3;
478
  ///Part, shared with list above, emulate following list
479
  List<Item> tmp_fields_list1, tmp_fields_list2, tmp_fields_list3;
480
  List<Item> &fields_list; ///< hold field list passed to mysql_select
481
  int error;
482
327.2.3 by Brian Aker
Refactoring of class Table
483
  order_st *order, *group_list, *proc_param; //hold parameters of mysql_select
1 by brian
clean slate
484
  COND *conds;                            // ---"---
485
  Item *conds_history;                    // store WHERE for explain
327.2.4 by Brian Aker
Refactoring table.h
486
  TableList *tables_list;           ///<hold 'tables' parameter of mysql_select
487
  List<TableList> *join_list;       ///< list of joined tables in reverse order
1 by brian
clean slate
488
  COND_EQUAL *cond_equal;
489
  SQL_SELECT *select;                ///<created in optimisation phase
490
  JOIN_TAB *return_tab;              ///<used only for outer joins
491
  Item **ref_pointer_array; ///<used pointer reference for this select
492
  // Copy of above to be used with different lists
493
  Item **items0, **items1, **items2, **items3, **current_ref_pointer_array;
482 by Brian Aker
Remove uint.
494
  uint32_t ref_pointer_array_size; ///< size of above in bytes
1 by brian
clean slate
495
  const char *zero_result_cause; ///< not 0 if exec must return zero result
496
  
497
  bool union_part; ///< this subselect is part of union 
498
  bool optimized; ///< flag to avoid double optimization in EXPLAIN
499
  
500
  Array<Item_in_subselect> sj_subselects;
501
502
  /* Descriptions of temporary tables used to weed-out semi-join duplicates */
503
  SJ_TMP_TABLE  *sj_tmp_tables;
504
505
  table_map cur_emb_sj_nests;
506
507
  /* 
508
    storage for caching buffers allocated during query execution. 
509
    These buffers allocations need to be cached as the thread memory pool is
510
    cleared only at the end of the execution of the whole query and not caching
511
    allocations that occur in repetition at execution time will result in 
512
    excessive memory usage.
513
  */  
514
  SORT_FIELD *sortorder;                        // make_unireg_sortorder()
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
515
  Table **table_reexec;                         // make_simple_join()
1 by brian
clean slate
516
  JOIN_TAB *join_tab_reexec;                    // make_simple_join()
517
  /* end of allocation caching storage */
518
520.1.22 by Brian Aker
Second pass of thd cleanup
519
  JOIN(Session *session_arg, List<Item> &fields_arg, uint64_t select_options_arg,
1 by brian
clean slate
520
       select_result *result_arg)
520.1.22 by Brian Aker
Second pass of thd cleanup
521
    :fields_list(fields_arg), sj_subselects(session_arg->mem_root, 4)
1 by brian
clean slate
522
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
523
    init(session_arg, fields_arg, select_options_arg, result_arg);
1 by brian
clean slate
524
  }
525
520.1.22 by Brian Aker
Second pass of thd cleanup
526
  void init(Session *session_arg, List<Item> &fields_arg, uint64_t select_options_arg,
1 by brian
clean slate
527
       select_result *result_arg)
528
  {
529
    join_tab= join_tab_save= 0;
530
    table= 0;
531
    tables= 0;
532
    const_tables= 0;
533
    join_list= 0;
534
    sort_and_group= 0;
535
    first_record= 0;
536
    do_send_rows= 1;
51.1.67 by Jay Pipes
standardized TRUE/FALSE
537
    resume_nested_loop= false;
1 by brian
clean slate
538
    send_records= 0;
539
    found_records= 0;
540
    fetch_limit= HA_POS_ERROR;
541
    examined_rows= 0;
542
    exec_tmp_table1= 0;
543
    exec_tmp_table2= 0;
544
    sortorder= 0;
545
    table_reexec= 0;
546
    join_tab_reexec= 0;
520.1.22 by Brian Aker
Second pass of thd cleanup
547
    session= session_arg;
1 by brian
clean slate
548
    sum_funcs= sum_funcs2= 0;
549
    having= tmp_having= having_history= 0;
550
    select_options= select_options_arg;
551
    result= result_arg;
520.1.22 by Brian Aker
Second pass of thd cleanup
552
    lock= session_arg->lock;
1 by brian
clean slate
553
    select_lex= 0; //for safety
554
    tmp_join= 0;
555
    select_distinct= test(select_options & SELECT_DISTINCT);
556
    no_order= 0;
557
    simple_order= 0;
558
    simple_group= 0;
559
    skip_sort_order= 0;
560
    need_tmp= 0;
561
    hidden_group_fields= 0; /*safety*/
562
    error= 0;
563
    select= 0;
564
    return_tab= 0;
565
    ref_pointer_array= items0= items1= items2= items3= 0;
566
    ref_pointer_array_size= 0;
567
    zero_result_cause= 0;
568
    optimized= 0;
569
    cond_equal= 0;
570
    group_optimized_away= 0;
571
572
    all_fields= fields_arg;
573
    fields_list= fields_arg;
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
574
    memset(&keyuse, 0, sizeof(keyuse));
1 by brian
clean slate
575
    tmp_table_param.init();
576
    tmp_table_param.end_write_records= HA_POS_ERROR;
577
    rollup.state= ROLLUP::STATE_NONE;
578
    sj_tmp_tables= NULL;
579
51.1.67 by Jay Pipes
standardized TRUE/FALSE
580
    no_const_tables= false;
1 by brian
clean slate
581
  }
582
482 by Brian Aker
Remove uint.
583
  int prepare(Item ***rref_pointer_array, TableList *tables, uint32_t wind_num,
584
	      COND *conds, uint32_t og_num, order_st *order, order_st *group,
327.2.3 by Brian Aker
Refactoring of class Table
585
	      Item *having, order_st *proc_param, SELECT_LEX *select,
1 by brian
clean slate
586
	      SELECT_LEX_UNIT *unit);
587
  int optimize();
588
  int reinit();
589
  void exec();
590
  int destroy();
591
  void restore_tmp();
592
  bool alloc_func_list();
593
  bool flatten_subqueries();
594
  bool setup_subquery_materialization();
595
  bool make_sum_func_list(List<Item> &all_fields, List<Item> &send_fields,
51.1.67 by Jay Pipes
standardized TRUE/FALSE
596
			  bool before_group_by, bool recompute= false);
1 by brian
clean slate
597
598
  inline void set_items_ref_array(Item **ptr)
599
  {
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
600
    memcpy(ref_pointer_array, ptr, ref_pointer_array_size);
1 by brian
clean slate
601
    current_ref_pointer_array= ptr;
602
  }
603
  inline void init_items_ref_array()
604
  {
605
    items0= ref_pointer_array + all_fields.elements;
606
    memcpy(items0, ref_pointer_array, ref_pointer_array_size);
607
    current_ref_pointer_array= items0;
608
  }
609
610
  bool rollup_init();
611
  bool rollup_make_fields(List<Item> &all_fields, List<Item> &fields,
612
			  Item_sum ***func);
482 by Brian Aker
Remove uint.
613
  int rollup_send_data(uint32_t idx);
614
  int rollup_write_data(uint32_t idx, Table *table);
1 by brian
clean slate
615
  void remove_subq_pushed_predicates(Item **where);
616
  /**
617
    Release memory and, if possible, the open tables held by this execution
618
    plan (and nested plans). It's used to release some tables before
619
    the end of execution in order to increase concurrency and reduce
620
    memory consumption.
621
  */
622
  void join_free();
623
  /** Cleanup this JOIN, possibly for reuse */
624
  void cleanup(bool full);
625
  void clear();
626
  bool save_join_tab();
627
  bool init_save_join_tab();
628
  bool send_row_on_empty_set()
629
  {
630
    return (do_send_rows && tmp_table_param.sum_func_count != 0 &&
631
	    !group_list);
632
  }
633
  bool change_result(select_result *result);
634
  bool is_top_level_join() const
635
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
636
    return (unit == &session->lex->unit && (unit->fake_select_lex == 0 ||
1 by brian
clean slate
637
                                        select_lex == unit->fake_select_lex));
638
  }
639
};
640
641
642
typedef struct st_select_check {
482 by Brian Aker
Remove uint.
643
  uint32_t const_ref,reg_ref;
1 by brian
clean slate
644
} SELECT_CHECK;
645
646
extern const char *join_type_str[];
647
void TEST_join(JOIN *join);
648
649
/* Extern functions in sql_select.cc */
650
bool store_val_in_field(Field *field, Item *val, enum_check_fields check_flag);
520.1.22 by Brian Aker
Second pass of thd cleanup
651
Table *create_tmp_table(Session *session,TMP_TABLE_PARAM *param,List<Item> &fields,
327.2.3 by Brian Aker
Refactoring of class Table
652
			order_st *group, bool distinct, bool save_sum_fields,
151 by Brian Aker
Ulonglong to uint64_t
653
			uint64_t select_options, ha_rows rows_limit,
1 by brian
clean slate
654
			char* alias);
520.1.22 by Brian Aker
Second pass of thd cleanup
655
void free_tmp_table(Session *session, Table *entry);
1 by brian
clean slate
656
void count_field_types(SELECT_LEX *select_lex, TMP_TABLE_PARAM *param, 
657
                       List<Item> &fields, bool reset_with_sum_func);
520.1.22 by Brian Aker
Second pass of thd cleanup
658
bool setup_copy_fields(Session *session, TMP_TABLE_PARAM *param,
1 by brian
clean slate
659
		       Item **ref_pointer_array,
660
		       List<Item> &new_list1, List<Item> &new_list2,
482 by Brian Aker
Remove uint.
661
		       uint32_t elements, List<Item> &fields);
1 by brian
clean slate
662
void copy_fields(TMP_TABLE_PARAM *param);
663
void copy_funcs(Item **func_ptr);
520.1.22 by Brian Aker
Second pass of thd cleanup
664
Field* create_tmp_field_from_field(Session *session, Field* org_field,
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
665
                                   const char *name, Table *table,
482 by Brian Aker
Remove uint.
666
                                   Item_field *item, uint32_t convert_blob_length);
1 by brian
clean slate
667
                                                                      
668
/* functions from opt_sum.cc */
669
bool simple_pred(Item_func *func_item, Item **args, bool *inv_order);
327.2.4 by Brian Aker
Refactoring table.h
670
int opt_sum_query(TableList *tables, List<Item> &all_fields,COND *conds);
1 by brian
clean slate
671
672
/* from sql_delete.cc, used by opt_range.cc */
673
extern "C" int refpos_order_cmp(void* arg, const void *a,const void *b);
674
675
/** class to copying an field/item to a key struct */
676
677
class store_key :public Sql_alloc
678
{
679
public:
51.1.67 by Jay Pipes
standardized TRUE/FALSE
680
  bool null_key; /* true <=> the value of the key has a null part */
1 by brian
clean slate
681
  enum store_key_result { STORE_KEY_OK, STORE_KEY_FATAL, STORE_KEY_CONV };
520.1.22 by Brian Aker
Second pass of thd cleanup
682
  store_key(Session *session, Field *field_arg, unsigned char *ptr, unsigned char *null, uint32_t length)
1 by brian
clean slate
683
    :null_key(0), null_ptr(null), err(0)
684
  {
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
685
    if (field_arg->type() == DRIZZLE_TYPE_BLOB)
1 by brian
clean slate
686
    {
687
      /* 
688
        Key segments are always packed with a 2 byte length prefix.
689
        See mi_rkey for details.
690
      */
691
      to_field= new Field_varstring(ptr, length, 2, null, 1, 
692
                                    Field::NONE, field_arg->field_name,
693
                                    field_arg->table->s, field_arg->charset());
694
      to_field->init(field_arg->table);
695
    }
696
    else
520.1.22 by Brian Aker
Second pass of thd cleanup
697
      to_field=field_arg->new_key_field(session->mem_root, field_arg->table,
1 by brian
clean slate
698
                                        ptr, null, 1);
699
  }
700
  virtual ~store_key() {}			/** Not actually needed */
701
  virtual const char *name() const=0;
702
703
  /**
704
    @brief sets ignore truncation warnings mode and calls the real copy method
705
706
    @details this function makes sure truncation warnings when preparing the
707
    key buffers don't end up as errors (because of an enclosing INSERT/UPDATE).
708
  */
709
  enum store_key_result copy()
710
  {
711
    enum store_key_result result;
520.1.22 by Brian Aker
Second pass of thd cleanup
712
    Session *session= to_field->table->in_use;
713
    enum_check_fields saved_count_cuted_fields= session->count_cuted_fields;
1 by brian
clean slate
714
520.1.22 by Brian Aker
Second pass of thd cleanup
715
    session->count_cuted_fields= CHECK_FIELD_IGNORE;
1 by brian
clean slate
716
717
    result= copy_inner();
718
520.1.22 by Brian Aker
Second pass of thd cleanup
719
    session->count_cuted_fields= saved_count_cuted_fields;
1 by brian
clean slate
720
721
    return result;
722
  }
723
724
 protected:
725
  Field *to_field;				// Store data here
481 by Brian Aker
Remove all of uchar.
726
  unsigned char *null_ptr;
727
  unsigned char err;
1 by brian
clean slate
728
729
  virtual enum store_key_result copy_inner()=0;
730
};
731
732
733
class store_key_field: public store_key
734
{
735
  Copy_field copy_field;
736
  const char *field_name;
737
 public:
520.1.22 by Brian Aker
Second pass of thd cleanup
738
  store_key_field(Session *session, Field *to_field_arg, unsigned char *ptr,
481 by Brian Aker
Remove all of uchar.
739
                  unsigned char *null_ptr_arg,
482 by Brian Aker
Remove uint.
740
		  uint32_t length, Field *from_field, const char *name_arg)
520.1.22 by Brian Aker
Second pass of thd cleanup
741
    :store_key(session, to_field_arg,ptr,
1 by brian
clean slate
742
	       null_ptr_arg ? null_ptr_arg : from_field->maybe_null() ? &err
481 by Brian Aker
Remove all of uchar.
743
	       : (unsigned char*) 0, length), field_name(name_arg)
1 by brian
clean slate
744
  {
745
    if (to_field)
746
    {
747
      copy_field.set(to_field,from_field,0);
748
    }
749
  }
750
  const char *name() const { return field_name; }
751
752
 protected: 
753
  enum store_key_result copy_inner()
754
  {
755
    copy_field.do_copy(&copy_field);
756
    null_key= to_field->is_null();
757
    return err != 0 ? STORE_KEY_FATAL : STORE_KEY_OK;
758
  }
759
};
760
761
762
class store_key_item :public store_key
763
{
764
 protected:
765
  Item *item;
766
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
767
  store_key_item(Session *session, Field *to_field_arg, unsigned char *ptr,
482 by Brian Aker
Remove uint.
768
                 unsigned char *null_ptr_arg, uint32_t length, Item *item_arg)
520.1.22 by Brian Aker
Second pass of thd cleanup
769
    :store_key(session, to_field_arg, ptr,
1 by brian
clean slate
770
	       null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ?
481 by Brian Aker
Remove all of uchar.
771
	       &err : (unsigned char*) 0, length), item(item_arg)
1 by brian
clean slate
772
  {}
773
  const char *name() const { return "func"; }
774
775
 protected:  
776
  enum store_key_result copy_inner()
777
  {
778
    int res= item->save_in_field(to_field, 1);
779
    null_key= to_field->is_null() || item->null_value;
780
    return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res); 
781
  }
782
};
783
784
785
class store_key_const_item :public store_key_item
786
{
787
  bool inited;
788
public:
520.1.22 by Brian Aker
Second pass of thd cleanup
789
  store_key_const_item(Session *session, Field *to_field_arg, unsigned char *ptr,
482 by Brian Aker
Remove uint.
790
		       unsigned char *null_ptr_arg, uint32_t length,
1 by brian
clean slate
791
		       Item *item_arg)
520.1.22 by Brian Aker
Second pass of thd cleanup
792
    :store_key_item(session, to_field_arg,ptr,
1 by brian
clean slate
793
		    null_ptr_arg ? null_ptr_arg : item_arg->maybe_null ?
481 by Brian Aker
Remove all of uchar.
794
		    &err : (unsigned char*) 0, length, item_arg), inited(0)
1 by brian
clean slate
795
  {
796
  }
797
  const char *name() const { return "const"; }
798
799
protected:  
800
  enum store_key_result copy_inner()
801
  {
802
    int res;
803
    if (!inited)
804
    {
805
      inited=1;
806
      if ((res= item->save_in_field(to_field, 1)))
807
      {       
808
        if (!err)
809
          err= res;
810
      }
811
    }
812
    null_key= to_field->is_null() || item->null_value;
813
    return (err > 2 ?  STORE_KEY_FATAL : (store_key_result) err);
814
  }
815
};
816
520.1.22 by Brian Aker
Second pass of thd cleanup
817
bool cp_buffer_from_ref(Session *session, TABLE_REF *ref);
1 by brian
clean slate
818
bool error_if_full_join(JOIN *join);
819
int safe_index_read(JOIN_TAB *tab);
520.1.22 by Brian Aker
Second pass of thd cleanup
820
COND *remove_eq_conds(Session *session, COND *cond, Item::cond_result *cond_value);
1 by brian
clean slate
821
int test_if_item_cache_changed(List<Cached_item> &list);