1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 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
21
#ifndef DRIZZLED_TABLE_LIST_H
22
#define DRIZZLED_TABLE_LIST_H
24
#include <drizzled/table.h>
31
class Natural_join_column;
33
class Select_Lex_Unit;
35
class Tmp_Table_Param;
41
class InfoSchemaTable;
45
struct nested_join_st;
48
* A Table referenced in the FROM clause.
50
* These table references can be of several types that correspond to
51
* different SQL elements. Below we list all types of TableLists with
52
* the necessary conditions to determine when a TableList instance
53
* belongs to a certain type.
55
* 1) table (TableList::view == NULL)
57
* (TableList::derived == NULL)
58
* - subquery - TableList::table is a temp table
59
* (TableList::derived != NULL)
63
* for schema tables TableList::field_translation may be != NULL
66
* 3) nested table reference (TableList::nested_join != NULL)
67
* - table sequence - e.g. (t1, t2, t3)
68
* @todo how to distinguish from a JOIN?
70
* @todo how to distinguish from a table sequence?
72
* (TableList::natural_join != NULL)
74
* (TableList::join_using_fields != NULL)
93
is_natural_join(false),
94
is_join_columns_complete(false),
100
join_using_fields(NULL),
102
next_name_resolution_table(NULL),
104
derived_result(NULL),
106
schema_select_lex(NULL),
111
i_s_requested_object(0),
113
table_name_length(0),
115
on_expr_dep_tables(0),
120
internal_tmp_table(false),
123
has_db_lookup_value(false),
124
has_table_lookup_value(false)
128
* List of tables local to a subquery (used by SQL_LIST). Considers
129
* views as leaves (unlike 'next_leaf' below). Created at parse time
130
* in Select_Lex::add_table_to_list() -> table_list.link_in_list().
132
TableList *next_local;
134
/** link in a global list of all queries tables */
135
TableList *next_global;
136
TableList **prev_global;
141
char *option; ///< Used by cache index
142
Item *on_expr; ///< Used with outer join
143
Table *table; ///< opened table
145
* The structure of ON expression presented in the member above
146
* can be changed during certain optimizations. This member
147
* contains a snapshot of AND-OR structure of the ON expression
148
* made after permanent transformations of the parse tree, and is
149
* used to restore ON clause before every reexecution of a prepared
150
* statement or stored procedure.
153
COND_EQUAL *cond_equal; ///< Used with outer join
155
* During parsing - left operand of NATURAL/USING join where 'this' is
156
* the right operand. After parsing (this->natural_join == this) iff
157
* 'this' represents a NATURAL or USING join operation. Thus after
158
* parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
160
TableList *natural_join;
162
* True if 'this' represents a nested join that is a NATURAL JOIN.
163
* For one of the operands of 'this', the member 'natural_join' points
164
* to the other operand of 'this'.
166
bool is_natural_join;
168
/** true if join_columns contains all columns of this table reference. */
169
bool is_join_columns_complete;
171
bool straight; ///< optimize with prev table
172
bool updating; ///< for replicate-do/ignore table
173
bool force_index; ///< prefer index over table scan
174
bool ignore_leaves; ///< preload only non-leaf nodes
177
* This TableList object corresponds to the table to be created
178
* so it is possible that it does not exist (used in CREATE TABLE
179
* ... SELECT implementation).
183
/** Field names in a USING clause for JOIN ... USING. */
184
List<String> *join_using_fields;
186
* Explicitly store the result columns of either a NATURAL/USING join or
187
* an operand of such a join.
189
List<Natural_join_column> *join_columns;
192
* List of nodes in a nested join tree, that should be considered as
193
* leaves with respect to name resolution. The leaves are: views,
194
* top-most nodes representing NATURAL/USING joins, subqueries, and
195
* base tables. All of these TableList instances contain a
196
* materialized list of columns. The list is local to a subquery.
198
TableList *next_name_resolution_table;
199
/** Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
200
List<Index_hint> *index_hints;
202
* select_result for derived table to pass it from table creation to table
205
select_union *derived_result;
206
Select_Lex_Unit *derived; ///< Select_Lex_Unit of derived table */
207
Select_Lex *schema_select_lex;
208
/** link to select_lex where this table was used */
209
Select_Lex *select_lex;
211
* List of all base tables local to a subquery including all view
212
* tables. Unlike 'next_local', this in this list views are *not*
213
* leaves. Created in setup_tables() -> make_leaves_list().
215
TableList *next_leaf;
216
thr_lock_type lock_type;
217
uint32_t outer_join; ///< Which join type
218
uint32_t shared; ///<Used in multi-upd
219
uint32_t i_s_requested_object;
221
size_t table_name_length;
222
table_map dep_tables; ///< tables the table depends on
223
table_map on_expr_dep_tables; ///< tables on expression depends on
224
nested_join_st *nested_join; ///< if the element is a nested join
225
TableList *embedding; ///< nested join containing the table
226
List<TableList> *join_list; ///< join list the table belongs to
227
plugin::StorageEngine *db_type; ///< table_type for handler
228
char timestamp_buffer[20]; ///< buffer for timestamp (19+1)
229
bool internal_tmp_table;
230
/** true if an alias for this table was specified in the SQL. */
233
* true if the table is referred to in the statement using a fully
234
* qualified name (<db_name>.<table_name>).
238
bool has_db_lookup_value;
239
bool has_table_lookup_value;
241
void set_underlying_merge();
242
bool setup_underlying(Session *session);
245
* If you change placeholder(), please check the condition in
246
* check_transactional_lock() too.
250
* Print table as it should be in join list.
252
* @param str string where table should be printed
254
void print(Session *session, String *str, enum_query_type query_type);
256
* Sets insert_values buffer
258
* @param[in] memory pool for allocating
263
* true - out of memory
265
bool set_insert_values(memory::Root *mem_root);
267
* Find underlying base tables (TableList) which represent given
268
* table_to_find (Table)
270
* @param[in] table to find
273
* NULL if table is not found
275
* Pointer to found table reference
277
TableList *find_underlying_table(Table *table);
279
* Retrieve the first (left-most) leaf in a nested join tree with
280
* respect to name resolution.
284
* Given that 'this' is a nested table reference, recursively walk
285
* down the left-most children of 'this' until we reach a leaf
286
* table reference with respect to name resolution.
289
* If 'this' is a nested table reference - the left-most child of
290
* the tree rooted in 'this',
293
TableList *first_leaf_for_name_resolution();
295
* Retrieve the last (right-most) leaf in a nested join tree with
296
* respect to name resolution.
300
* Given that 'this' is a nested table reference, recursively walk
301
* down the right-most children of 'this' until we reach a leaf
302
* table reference with respect to name resolution.
305
* If 'this' is a nested table reference - the right-most child of
306
* the tree rooted in 'this',
309
TableList *last_leaf_for_name_resolution();
311
* Test if this is a leaf with respect to name resolution.
315
* A table reference is a leaf with respect to name resolution if
316
* it is either a leaf node in a nested join tree (table, view,
317
* schema table, subquery), or an inner node that represents a
318
* NATURAL/USING join, or a nested join with materialized join
322
* true if a leaf, false otherwise.
324
bool is_leaf_for_name_resolution();
325
inline TableList *top_table()
329
* Return subselect that contains the FROM list this table is taken from
332
* Subselect item for the subquery that contains the FROM list
333
* this table is taken from if there is any
337
Item_subselect *containing_subselect();
340
* Compiles the tagged hints list and fills up st_table::keys_in_use_for_query,
341
* st_table::keys_in_use_for_group_by, st_table::keys_in_use_for_order_by,
342
* st_table::force_index and st_table::covering_keys.
344
* @param the Table to operate on.
348
* The parser collects the index hints for each table in a "tagged list"
349
* (TableList::index_hints). Using the information in this tagged list
350
* this function sets the members Table::keys_in_use_for_query,
351
* Table::keys_in_use_for_group_by, Table::keys_in_use_for_order_by,
352
* Table::force_index and Table::covering_keys.
354
* Current implementation of the runtime does not allow mixing FORCE INDEX
355
* and USE INDEX, so this is checked here. Then the FORCE INDEX list
356
* (if non-empty) is appended to the USE INDEX list and a flag is set.
358
* Multiple hints of the same kind are processed so that each clause
359
* is applied to what is computed in the previous clause.
362
* USE INDEX (i1) USE INDEX (i2)
365
* and means "consider only i1 and i2".
368
* USE INDEX () USE INDEX (i1)
371
* and means "consider only the index i1"
373
* It is OK to have the same index several times, e.g. "USE INDEX (i1,i1)" is
376
* Different kind of hints (USE/FORCE/IGNORE) are processed in the following
378
* 1. All indexes in USE (or FORCE) INDEX are added to the mask.
379
* 2. All IGNORE INDEX
380
* e.g. "USE INDEX i1, IGNORE INDEX i1, USE INDEX i1" will not use i1 at all
381
* as if we had "USE INDEX i1, USE INDEX i1, IGNORE INDEX i1".
382
* As an optimization if there is a covering index, and we have
383
* IGNORE INDEX FOR GROUP/order_st, and this index is used for the JOIN part,
384
* then we have to ignore the IGNORE INDEX FROM GROUP/order_st.
387
* false no errors found
389
* true found and reported an error.
391
bool process_index_hints(Table *table);
393
* Creates a table definition cache key for this table entry.
395
* @param[out] Create key here (must be of size MAX_DBKEY_LENGTH)
399
* The table cache_key is created from:
403
* if the table is a tmp table, we add the following to make each tmp table
404
* unique on the slave:
406
* 4 bytes for master thread id
407
* 4 bytes pseudo thread id
412
uint32_t create_table_def_key(char *key);
415
void close_thread_tables(Session *session);
417
} /* namespace drizzled */
419
#endif /* DRIZZLED_TABLE_LIST_H */