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"
37
#include "drizzled/records.h"
44
/* Values for JoinTable::packed_info */
45
#define TAB_INFO_HAVE_VALUE 1
46
#define TAB_INFO_USING_INDEX 2
47
#define TAB_INFO_USING_WHERE 4
48
#define TAB_INFO_FULL_SCAN_ON_NULL 8
53
/** Description of an access method */
81
pre_idx_push_select_cond(NULL),
86
not_null_compl(false),
89
first_unmatched(NULL),
91
read_first_record(NULL),
110
cached_eq_ref_table(0),
112
not_used_in_distinct(0),
116
insideout_match_tab(NULL),
123
optimizer::KeyUse *keyuse; /**< pointer to first used key */
124
optimizer::SqlSelect *select;
126
optimizer::QuickSelectInterface *quick;
128
The value of select_cond before we've attempted to do Index Condition
129
Pushdown. We may need to restore everything back if we first choose one
130
index but then reconsider (see test_if_skip_sort_order() for such
132
NULL means no index condition pushdown was performed.
134
Item *pre_idx_push_select_cond;
135
Item **on_expr_ref; /**< pointer to the associated on expression */
136
COND_EQUAL *cond_equal; /**< multiple equalities for the on expression */
137
JoinTable *first_inner; /**< first inner table for including outerjoin */
138
bool found; /**< true after all matches or null complement */
139
bool not_null_compl;/**< true before null complement is added */
140
JoinTable *last_inner; /**< last table table for embedding outer join */
141
JoinTable *first_upper; /**< first inner table for embedding outer join */
142
JoinTable *first_unmatched; /**< used for optimization purposes only */
144
/* Special content for EXPLAIN 'Extra' column or NULL if none */
147
Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
148
column, or 0 if there is no info.
150
uint32_t packed_info;
152
Read_record_func read_first_record;
153
Next_select_func next_select;
154
ReadRecord read_record;
156
Currently the following two fields are used only for a [NOT] IN subquery
157
if it is executed by an alternative full table scan when the left operand of
158
the subquery predicate is evaluated to NULL.
160
Read_record_func save_read_first_record; /**< to save read_first_record */
161
int (*save_read_record) (ReadRecord *); /**< to save read_record.read_record */
163
key_map const_keys; /**< Keys with constant part */
164
key_map checked_keys; /**< Keys checked in find_best */
166
key_map keys; /**< all keys with can be used */
168
/** Either #rows in the table or 1 for const table. */
171
Number of records that will be scanned (yes scanned, not returned) by the
172
best 'independent' access method, i.e. table scan or QUICK_*_SELECT)
174
ha_rows found_records;
176
Cost of accessing the table using "ALL" or range/index_merge access
177
method (but not 'index' for some reason), i.e. this matches method which
178
E(#records) is in found_records.
183
table_map key_dependent;
186
uint32_t status; /**< Save status for cache */
187
uint32_t used_fields; /**< Number of used fields in join set */
188
uint32_t used_fieldlength; /**< Not sure... */
189
uint32_t used_blobs; /**< Number of BLOB fields in join set */
190
enum access_method type; /**< Access method. */
191
bool cached_eq_ref_table;
193
bool not_used_in_distinct;
194
/** True if index-based access method must return records in order */
197
If it's not 0 the number stored this field indicates that the index
198
scan has been chosen to access the table data and we expect to scan
199
this number of rows for the table.
202
table_reference_st ref;
207
ptr - this join tab should do an InsideOut scan. Points
208
to the tab for which we'll need to check tab->found_match.
210
NULL - Not an insideout scan.
212
JoinTable *insideout_match_tab;
213
unsigned char *insideout_buf; /**< Buffer to save index tuple to be able to skip dups */
215
/** Used by InsideOut scan. Just set to true when have found a row. */
220
/* If set, the rowid of this table must be put into the temptable. */
223
If set, one should call h->position() to obtain the rowid,
224
otherwise, the rowid is assumed to already be in h->ref
225
(this is because join caching and filesort() save the rowid and then
226
put it back into h->ref)
230
/** A set of flags from the above enum */
231
int rowid_keep_flags;
233
/** Bitmap of nested joins this table is part of */
234
std::bitset<64> embedding_map;
238
inline bool is_using_loose_index_scan()
240
return (select && select->quick &&
241
(select->quick->get_type() ==
242
optimizer::QuickSelectInterface::QS_TYPE_GROUP_MIN_MAX));
245
void readCachedRecord();
248
} /* namespace drizzled */
250
#endif /* DRIZZLED_JOIN_TABLE_H */