1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008-2009 Sun Microsystems
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.
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.
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
24
* Defines the JoinTable class which is the primary class
25
* used in the nested loops join implementation.
28
#ifndef DRIZZLED_JOIN_TABLE_H
29
#define DRIZZLED_JOIN_TABLE_H
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"
42
/* Values for JoinTable::packed_info */
43
#define TAB_INFO_HAVE_VALUE 1
44
#define TAB_INFO_USING_INDEX 2
45
#define TAB_INFO_USING_WHERE 4
46
#define TAB_INFO_FULL_SCAN_ON_NULL 8
51
/** Description of an access method */
79
pre_idx_push_select_cond(NULL),
84
not_null_compl(false),
87
first_unmatched(NULL),
89
read_first_record(NULL),
108
cached_eq_ref_table(0),
110
not_used_in_distinct(0),
114
insideout_match_tab(NULL),
121
optimizer::KeyUse *keyuse; /**< pointer to first used key */
122
optimizer::SqlSelect *select;
124
optimizer::QuickSelectInterface *quick;
126
The value of select_cond before we've attempted to do Index Condition
127
Pushdown. We may need to restore everything back if we first choose one
128
index but then reconsider (see test_if_skip_sort_order() for such
130
NULL means no index condition pushdown was performed.
132
Item *pre_idx_push_select_cond;
133
Item **on_expr_ref; /**< pointer to the associated on expression */
134
COND_EQUAL *cond_equal; /**< multiple equalities for the on expression */
135
JoinTable *first_inner; /**< first inner table for including outerjoin */
136
bool found; /**< true after all matches or null complement */
137
bool not_null_compl;/**< true before null complement is added */
138
JoinTable *last_inner; /**< last table table for embedding outer join */
139
JoinTable *first_upper; /**< first inner table for embedding outer join */
140
JoinTable *first_unmatched; /**< used for optimization purposes only */
142
/* Special content for EXPLAIN 'Extra' column or NULL if none */
145
Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
146
column, or 0 if there is no info.
148
uint32_t packed_info;
150
Read_record_func read_first_record;
151
Next_select_func next_select;
152
READ_RECORD read_record;
154
Currently the following two fields are used only for a [NOT] IN subquery
155
if it is executed by an alternative full table scan when the left operand of
156
the subquery predicate is evaluated to NULL.
158
Read_record_func save_read_first_record; /**< to save read_first_record */
159
int (*save_read_record) (READ_RECORD *); /**< to save read_record.read_record */
161
key_map const_keys; /**< Keys with constant part */
162
key_map checked_keys; /**< Keys checked in find_best */
164
key_map keys; /**< all keys with can be used */
166
/** Either #rows in the table or 1 for const table. */
169
Number of records that will be scanned (yes scanned, not returned) by the
170
best 'independent' access method, i.e. table scan or QUICK_*_SELECT)
172
ha_rows found_records;
174
Cost of accessing the table using "ALL" or range/index_merge access
175
method (but not 'index' for some reason), i.e. this matches method which
176
E(#records) is in found_records.
181
table_map key_dependent;
184
uint32_t status; /**< Save status for cache */
185
uint32_t used_fields; /**< Number of used fields in join set */
186
uint32_t used_fieldlength; /**< Not sure... */
187
uint32_t used_blobs; /**< Number of BLOB fields in join set */
188
enum access_method type; /**< Access method. */
189
bool cached_eq_ref_table;
191
bool not_used_in_distinct;
192
/** True if index-based access method must return records in order */
195
If it's not 0 the number stored this field indicates that the index
196
scan has been chosen to access the table data and we expect to scan
197
this number of rows for the table.
200
table_reference_st ref;
205
ptr - this join tab should do an InsideOut scan. Points
206
to the tab for which we'll need to check tab->found_match.
208
NULL - Not an insideout scan.
210
JoinTable *insideout_match_tab;
211
unsigned char *insideout_buf; /**< Buffer to save index tuple to be able to skip dups */
213
/** Used by InsideOut scan. Just set to true when have found a row. */
218
/* If set, the rowid of this table must be put into the temptable. */
221
If set, one should call h->position() to obtain the rowid,
222
otherwise, the rowid is assumed to already be in h->ref
223
(this is because join caching and filesort() save the rowid and then
224
put it back into h->ref)
228
/** A set of flags from the above enum */
229
int rowid_keep_flags;
231
/** Bitmap of nested joins this table is part of */
232
std::bitset<64> embedding_map;
236
inline bool is_using_loose_index_scan()
238
return (select && select->quick &&
239
(select->quick->get_type() ==
240
optimizer::QuickSelectInterface::QS_TYPE_GROUP_MIN_MAX));
243
void readCachedRecord();
246
} /* namespace drizzled */
248
#endif /* DRIZZLED_JOIN_TABLE_H */