~drizzle-trunk/drizzle/development

1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
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.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
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
 *
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
24
 * Defines the JoinTable class which is the primary class
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
25
 * used in the nested loops join implementation.
26
 */
27
1122.2.10 by Monty Taylor
Fixed all of the include guards.
28
#ifndef DRIZZLED_JOIN_TABLE_H
29
#define DRIZZLED_JOIN_TABLE_H
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
30
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
31
#include <drizzled/enum_nested_loop_state.h>
32
#include <drizzled/table_reference.h>
33
#include <drizzled/optimizer/range.h>
34
#include <drizzled/join_cache.h>
35
#include <drizzled/optimizer/key_use.h>
1089.1.8 by Brian Aker
Shuffled around a few structures.
36
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
37
#include <drizzled/records.h>
1538 by Brian Aker
Code shuffle on ReadRecord
38
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
39
#include <bitset>
40
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
41
namespace drizzled
42
{
43
2141.3.1 by vjsamuel1990 at gmail
Merge encapsulate join_read_const_table() into JoinTable.
44
class Table;
45
46
namespace optimizer
47
{
48
  class Position;
49
}
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
50
/* Values for JoinTable::packed_info */
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
51
#define TAB_INFO_HAVE_VALUE 1
52
#define TAB_INFO_USING_INDEX 2
53
#define TAB_INFO_USING_WHERE 4
54
#define TAB_INFO_FULL_SCAN_ON_NULL 8
55
1108.6.20 by Padraig O'Sullivan
Renamed access_type to access_method due to conflicts on Solaris.
56
/** Description of an access method */
57
enum access_method
1089.1.8 by Brian Aker
Shuffled around a few structures.
58
{ 
1108.6.20 by Padraig O'Sullivan
Renamed access_type to access_method due to conflicts on Solaris.
59
  AM_UNKNOWN,
60
  AM_SYSTEM,
61
  AM_CONST,
62
  AM_EQ_REF,
63
  AM_REF,
64
  AM_MAYBE_REF,
65
	AM_ALL,
66
  AM_RANGE,
67
  AM_NEXT,
68
  AM_REF_OR_NULL,
69
  AM_UNIQUE_SUBQUERY,
70
  AM_INDEX_SUBQUERY,
71
  AM_INDEX_MERGE
1089.1.8 by Brian Aker
Shuffled around a few structures.
72
};
73
74
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
75
class JoinTable 
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
76
{
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
77
public:
1221.1.1 by Jay Pipes
Fixes some valgrind warnings regarding conditionals depending on unintialized variables. Use initializer lists properly, dang it. :) Also, removed the new_Cached_item() function's use_result_field, as this was only used for views and was producing a valgrind warning unnecessarily.
78
  JoinTable() :
79
    table(NULL),
80
    keyuse(NULL),
81
    select(NULL),
82
    select_cond(NULL),
83
    quick(NULL),
84
    pre_idx_push_select_cond(NULL),
85
    on_expr_ref(NULL),
86
    cond_equal(NULL),
87
    first_inner(NULL),
88
    found(false),
89
    not_null_compl(false),
90
    last_inner(NULL),
91
    first_upper(NULL),
92
    first_unmatched(NULL),
93
    packed_info(0),
94
    read_first_record(NULL),
95
    next_select(NULL),
96
    worst_seeks(0.0),
97
    const_keys(0),
98
    checked_keys(0),
99
    needed_reg(0),
100
    keys(0),
101
    records(0),
102
    found_records(0),
103
    read_time(0),
104
    dependent(0),
105
    key_dependent(0),
106
    use_quick(0),
107
    index(0),
108
    status(0),
109
    used_fields(0),
110
    used_fieldlength(0),
111
    used_blobs(0),
112
    type(AM_UNKNOWN),
113
    cached_eq_ref_table(0),
114
    eq_ref_table(0),
115
    not_used_in_distinct(0),
116
    sorted(0),
117
    limit(0),
118
    join(NULL),
119
    insideout_match_tab(NULL),
120
    insideout_buf(NULL),
121
    found_match(false),
122
    rowid_keep_flags(0),
123
    embedding_map(0)
124
  {}
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
125
  Table *table;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
126
  optimizer::KeyUse *keyuse; /**< pointer to first used key */
127
  optimizer::SqlSelect *select;
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
128
  COND *select_cond;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
129
  optimizer::QuickSelectInterface *quick;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
130
  /**
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
131
    The value of select_cond before we've attempted to do Index Condition
132
    Pushdown. We may need to restore everything back if we first choose one
133
    index but then reconsider (see test_if_skip_sort_order() for such
134
    scenarios).
135
    NULL means no index condition pushdown was performed.
136
  */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
137
  Item *pre_idx_push_select_cond;
138
  Item **on_expr_ref;   /**< pointer to the associated on expression   */
139
  COND_EQUAL *cond_equal;    /**< multiple equalities for the on expression */
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
140
  JoinTable *first_inner;   /**< first inner table for including outerjoin */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
141
  bool found;         /**< true after all matches or null complement */
142
  bool not_null_compl;/**< true before null complement is added      */
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
143
  JoinTable *last_inner;    /**< last table table for embedding outer join */
144
  JoinTable *first_upper;  /**< first inner table for embedding outer join */
145
  JoinTable *first_unmatched; /**< used for optimization purposes only     */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
146
147
  /* Special content for EXPLAIN 'Extra' column or NULL if none */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
148
  const char *info;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
149
  /*
150
    Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
151
    column, or 0 if there is no info.
152
  */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
153
  uint32_t packed_info;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
154
155
  Read_record_func read_first_record;
156
  Next_select_func next_select;
1538 by Brian Aker
Code shuffle on ReadRecord
157
  ReadRecord	read_record;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
158
  /*
159
    Currently the following two fields are used only for a [NOT] IN subquery
160
    if it is executed by an alternative full table scan when the left operand of
161
    the subquery predicate is evaluated to NULL.
162
  */
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
163
  Read_record_func save_read_first_record; /**< to save read_first_record */
1538 by Brian Aker
Code shuffle on ReadRecord
164
  int (*save_read_record) (ReadRecord *); /**< to save read_record.read_record */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
165
  double worst_seeks;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
166
  key_map	const_keys; /**< Keys with constant part */
167
  key_map	checked_keys; /**< Keys checked in find_best */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
168
  key_map	needed_reg;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
169
  key_map keys; /**< all keys with can be used */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
170
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
171
  /** Either #rows in the table or 1 for const table.  */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
172
  ha_rows	records;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
173
  /**
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
174
    Number of records that will be scanned (yes scanned, not returned) by the
175
    best 'independent' access method, i.e. table scan or QUICK_*_SELECT)
176
  */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
177
  ha_rows found_records;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
178
  /**
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
179
    Cost of accessing the table using "ALL" or range/index_merge access
180
    method (but not 'index' for some reason), i.e. this matches method which
181
    E(#records) is in found_records.
182
  */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
183
  ha_rows read_time;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
184
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
185
  table_map	dependent;
186
  table_map key_dependent;
187
  uint32_t use_quick;
188
  uint32_t index;
189
  uint32_t status; /**< Save status for cache */
190
  uint32_t used_fields; /**< Number of used fields in join set */
191
  uint32_t used_fieldlength; /**< Not sure... */
192
  uint32_t used_blobs; /**< Number of BLOB fields in join set */
1108.6.20 by Padraig O'Sullivan
Renamed access_type to access_method due to conflicts on Solaris.
193
  enum access_method type; /**< Access method. */
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
194
  bool cached_eq_ref_table;
195
  bool eq_ref_table;
196
  bool not_used_in_distinct;
197
  /** True if index-based access method must return records in order */
198
  bool sorted;
199
  /**
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
200
    If it's not 0 the number stored this field indicates that the index
201
    scan has been chosen to access the table data and we expect to scan
202
    this number of rows for the table.
203
  */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
204
  ha_rows limit;
1089.1.14 by Brian Aker
Fix TABLE_REF structure
205
  table_reference_st	ref;
1539.1.6 by Brian Aker
Update for Join structure changes.
206
  JoinCache cache;
1541.1.1 by Brian Aker
JOIN -> Join rename
207
  Join *join;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
208
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
209
  /**
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
210
     ptr  - this join tab should do an InsideOut scan. Points
211
            to the tab for which we'll need to check tab->found_match.
212
213
     NULL - Not an insideout scan.
214
  */
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
215
  JoinTable *insideout_match_tab;
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
216
  unsigned char *insideout_buf; /**< Buffer to save index tuple to be able to skip dups */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
217
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
218
  /** Used by InsideOut scan. Just set to true when have found a row. */
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
219
  bool found_match;
220
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
221
  enum 
222
  {
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
223
    /* If set, the rowid of this table must be put into the temptable. */
224
    KEEP_ROWID=1,
225
    /*
226
      If set, one should call h->position() to obtain the rowid,
227
      otherwise, the rowid is assumed to already be in h->ref
228
      (this is because join caching and filesort() save the rowid and then
229
      put it back into h->ref)
230
    */
231
    CALL_POSITION=2
232
  };
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
233
  /** A set of flags from the above enum */
1039.2.7 by Jay Pipes
Yet more style and indentation cleanups.
234
  int rowid_keep_flags;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
235
1055.2.21 by Jay Pipes
Documentation and indentation/style cleanups in sql_select, opt_range.h and join_tab.h. This patch doxygenates classes/structs and their member variables.
236
  /** Bitmap of nested joins this table is part of */
1100.4.2 by Padraig O'Sullivan
Removed the typedef for nested_join_map and instead just declare these
237
  std::bitset<64> embedding_map;
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
238
239
  void cleanup();
1089.1.13 by Brian Aker
Sorting methods into class files.
240
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
241
  inline bool is_using_loose_index_scan()
242
  {
243
    return (select && select->quick &&
244
            (select->quick->get_type() ==
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
245
             optimizer::QuickSelectInterface::QS_TYPE_GROUP_MIN_MAX));
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
246
  }
1089.1.13 by Brian Aker
Sorting methods into class files.
247
248
  void readCachedRecord();
2141.3.3 by vjsamuel1990 at gmail
Merge change nested_join_st to NestedJoin
249
  int joinReadConstTable(optimizer::Position *pos);
2147.5.3 by vjsamuel1990 at gmail
Merge re write encapsulated join_read_system() function name to abide to coding standards.
250
  int joinReadSystem();
1089.1.1 by Brian Aker
Remove of JOIN_TAB to JoinTable
251
};
1039.2.5 by Jay Pipes
Style cleanups and moves JOIN_TAB definition out into its own header.
252
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
253
} /* namespace drizzled */
254
1122.2.10 by Monty Taylor
Fixed all of the include guards.
255
#endif /* DRIZZLED_JOIN_TABLE_H */