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, Inc.
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"
50
/* Values for JoinTable::packed_info */
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
56
/** Description of an access method */
84
pre_idx_push_select_cond(NULL),
89
not_null_compl(false),
92
first_unmatched(NULL),
94
read_first_record(NULL),
113
cached_eq_ref_table(0),
115
not_used_in_distinct(0),
119
insideout_match_tab(NULL),
126
optimizer::KeyUse *keyuse; /**< pointer to first used key */
127
optimizer::SqlSelect *select;
129
optimizer::QuickSelectInterface *quick;
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
135
NULL means no index condition pushdown was performed.
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 */
140
JoinTable *first_inner; /**< first inner table for including outerjoin */
141
bool found; /**< true after all matches or null complement */
142
bool not_null_compl;/**< true before null complement is added */
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 */
147
/* Special content for EXPLAIN 'Extra' column or NULL if none */
150
Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
151
column, or 0 if there is no info.
153
uint32_t packed_info;
155
Read_record_func read_first_record;
156
Next_select_func next_select;
157
ReadRecord read_record;
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.
163
Read_record_func save_read_first_record; /**< to save read_first_record */
164
int (*save_read_record) (ReadRecord *); /**< to save read_record.read_record */
166
key_map const_keys; /**< Keys with constant part */
167
key_map checked_keys; /**< Keys checked in find_best */
169
key_map keys; /**< all keys with can be used */
171
/** Either #rows in the table or 1 for const table. */
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)
177
ha_rows found_records;
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.
186
table_map key_dependent;
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 */
193
enum access_method type; /**< Access method. */
194
bool cached_eq_ref_table;
196
bool not_used_in_distinct;
197
/** True if index-based access method must return records in order */
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.
205
table_reference_st ref;
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.
213
NULL - Not an insideout scan.
215
JoinTable *insideout_match_tab;
216
unsigned char *insideout_buf; /**< Buffer to save index tuple to be able to skip dups */
218
/** Used by InsideOut scan. Just set to true when have found a row. */
223
/* If set, the rowid of this table must be put into the temptable. */
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)
233
/** A set of flags from the above enum */
234
int rowid_keep_flags;
236
/** Bitmap of nested joins this table is part of */
237
std::bitset<64> embedding_map;
241
inline bool is_using_loose_index_scan()
243
return (select && select->quick &&
244
(select->quick->get_type() ==
245
optimizer::QuickSelectInterface::QS_TYPE_GROUP_MIN_MAX));
248
void readCachedRecord();
249
int joinReadConstTable(optimizer::Position *pos);
250
int joinReadSystem();
253
} /* namespace drizzled */
255
#endif /* DRIZZLED_JOIN_TABLE_H */