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
/* Structs that defines the Table */
23
#ifndef DRIZZLED_TABLE_H
24
#define DRIZZLED_TABLE_H
26
#include <storage/myisam/myisam.h>
27
#include <drizzled/order.h>
28
#include <drizzled/filesort_info.h>
29
#include <drizzled/natural_join_column.h>
30
#include <drizzled/nested_join.h>
31
#include <drizzled/field_iterator.h>
33
class Item; /* Needed by order_st */
1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
/* Structs that defines the TABLE */
19
class Item; /* Needed by ORDER */
34
20
class Item_subselect;
35
21
class st_select_lex_unit;
36
22
class st_select_lex;
38
24
class Security_context;
41
26
/*************************************************************************/
28
/* Order clause list element */
30
typedef struct st_order {
31
struct st_order *next;
32
Item **item; /* Point at item in select fields */
33
Item *item_ptr; /* Storage for initial item */
34
Item **item_copy; /* For SPs; the original item ptr */
35
int counter; /* position in SELECT list, correct
36
only if counter_used is true*/
37
bool asc; /* true if ascending */
38
bool free_me; /* true if item isn't shared */
39
bool in_field_list; /* true if in select field list */
40
bool counter_used; /* parameter was counter of columns */
41
Field *field; /* If tmp-table group */
42
char *buff; /* If tmp-table group */
43
table_map used, depend_map;
43
46
enum tmp_table_type
45
48
NO_TMP_TABLE, NON_TRANSACTIONAL_TMP_TABLE, TRANSACTIONAL_TMP_TABLE,
46
49
INTERNAL_TMP_TABLE, SYSTEM_TMP_TABLE, TMP_TABLE_FRM_FILE_ONLY
49
bool mysql_frm_type(THD *thd, char *path, enum legacy_db_type *dbt);
58
frm_type_enum mysql_frm_type(THD *thd, char *path, enum legacy_db_type *dbt);
52
61
enum release_type { RELEASE_NORMAL, RELEASE_WAIT_FOR_DROP };
63
typedef struct st_filesort_info
65
IO_CACHE *io_cache; /* If sorted through filesort */
66
uchar **sort_keys; /* Buffer for sorting keys */
67
uchar *buffpek; /* Buffer for buffpek structures */
68
uint buffpek_len; /* Max number of buffpeks in the buffer */
69
uchar *addon_buf; /* Pointer to a buffer if sorted with fields */
70
size_t addon_length; /* Length of the buffer */
71
struct st_sort_addon_field *addon_field; /* Pointer to the fields info */
72
void (*unpack)(struct st_sort_addon_field *, uchar *); /* To unpack back */
73
uchar *record_pointers; /* If sorted in memory */
74
ha_rows found_records; /* How many records in sort */
55
79
Values in this enum are used to indicate how a tables TIMESTAMP field
56
80
should be treated. It can be set to the current timestamp on insert or
208
244
enum ha_choice transactional;
209
245
enum ha_choice page_checksum;
211
uint32_t ref_count; /* How many Table objects uses this */
212
uint32_t open_count; /* Number of tables in open list */
213
uint32_t blob_ptr_size; /* 4 or 8 */
214
uint32_t key_block_size; /* create key_block_size, if used */
215
uint32_t null_bytes, last_null_bit_pos;
216
uint32_t fields; /* Number of fields */
217
uint32_t rec_buff_length; /* Size of table->record[] buffer */
218
uint32_t keys, key_parts;
219
uint32_t max_key_length, max_unique_length, total_key_length;
220
uint32_t uniques; /* Number of UNIQUE index */
221
uint32_t null_fields; /* number of null fields */
222
uint32_t blob_fields; /* number of blob fields */
223
uint32_t timestamp_field_offset; /* Field number for timestamp field */
224
uint32_t varchar_fields; /* number of varchar fields */
225
uint32_t db_create_options; /* Create options from database */
226
uint32_t db_options_in_use; /* Options in use */
227
uint32_t db_record_offset; /* if HA_REC_IN_SEQ */
228
uint32_t rowid_field_offset; /* Field_nr +1 to rowid field */
247
uint ref_count; /* How many TABLE objects uses this */
248
uint open_count; /* Number of tables in open list */
249
uint blob_ptr_size; /* 4 or 8 */
250
uint key_block_size; /* create key_block_size, if used */
251
uint null_bytes, last_null_bit_pos;
252
uint fields; /* Number of fields */
253
uint rec_buff_length; /* Size of table->record[] buffer */
254
uint keys, key_parts;
255
uint max_key_length, max_unique_length, total_key_length;
256
uint uniques; /* Number of UNIQUE index */
257
uint null_fields; /* number of null fields */
258
uint blob_fields; /* number of blob fields */
259
uint timestamp_field_offset; /* Field number for timestamp field */
260
uint varchar_fields; /* number of varchar fields */
261
uint db_create_options; /* Create options from database */
262
uint db_options_in_use; /* Options in use */
263
uint db_record_offset; /* if HA_REC_IN_SEQ */
264
uint rowid_field_offset; /* Field_nr +1 to rowid field */
229
265
/* Index of auto-updated TIMESTAMP field in field array */
230
uint32_t primary_key;
231
uint32_t next_number_index; /* autoincrement key number */
232
uint32_t next_number_key_offset; /* autoinc keypart offset in a key */
233
uint32_t next_number_keypart; /* autoinc keypart number in a key */
234
uint32_t error, open_errno, errarg; /* error from open_table_def() */
235
uint32_t column_bitmap_size;
236
unsigned char frm_version;
267
uint next_number_index; /* autoincrement key number */
268
uint next_number_key_offset; /* autoinc keypart offset in a key */
269
uint next_number_keypart; /* autoinc keypart number in a key */
270
uint error, open_errno, errarg; /* error from open_table_def() */
271
uint column_bitmap_size;
237
273
bool null_field_first;
274
bool system; /* Set if system table (one record) */
238
275
bool db_low_byte_first; /* Portable row format */
240
277
bool name_lock, replace_with_name_lock;
241
278
bool waiting_on_cond; /* Protection against free */
242
uint32_t table_map_id; /* for row-based replication */
279
ulong table_map_id; /* for row-based replication */
243
280
uint64_t table_map_version;
716
Column reference of a NATURAL/USING join. Since column references in
717
joins can be both from views and stored tables, may point to either a
718
Field (for tables), or a Field_translator (for views).
721
class Natural_join_column: public Sql_alloc
724
Field_translator *view_field; /* Column reference of merge view. */
725
Field *table_field; /* Column reference of table or temp view. */
726
TABLE_LIST *table_ref; /* Original base table/view reference. */
728
True if a common join column of two NATURAL/USING join operands. Notice
729
that when we have a hierarchy of nested NATURAL/USING joins, a column can
730
be common at some level of nesting but it may not be common at higher
731
levels of nesting. Thus this flag may change depending on at which level
732
we are looking at some column.
736
Natural_join_column(Field_translator *field_param, TABLE_LIST *tab);
737
Natural_join_column(Field *field_param, TABLE_LIST *tab);
739
Item *create_item(THD *thd);
741
const char *table_name();
742
const char *db_name();
747
Table reference in the FROM clause.
749
These table references can be of several types that correspond to
750
different SQL elements. Below we list all types of TABLE_LISTs with
751
the necessary conditions to determine when a TABLE_LIST instance
752
belongs to a certain type.
754
1) table (TABLE_LIST::view == NULL)
756
(TABLE_LIST::derived == NULL)
757
- subquery - TABLE_LIST::table is a temp table
758
(TABLE_LIST::derived != NULL)
759
- information schema table
760
(TABLE_LIST::schema_table != NULL)
761
NOTICE: for schema tables TABLE_LIST::field_translation may be != NULL
762
2) view (TABLE_LIST::view != NULL)
763
- merge (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_MERGE)
764
also (TABLE_LIST::field_translation != NULL)
765
- tmptable (TABLE_LIST::effective_algorithm == VIEW_ALGORITHM_TMPTABLE)
766
also (TABLE_LIST::field_translation == NULL)
767
3) nested table reference (TABLE_LIST::nested_join != NULL)
768
- table sequence - e.g. (t1, t2, t3)
769
TODO: how to distinguish from a JOIN?
771
TODO: how to distinguish from a table sequence?
773
(TABLE_LIST::natural_join != NULL)
775
(TABLE_LIST::join_using_fields != NULL)
783
TABLE_LIST() {} /* Remove gcc warning */
786
Prepare TABLE_LIST that consists of one table instance to use in
787
simple_open_and_lock_tables
789
inline void init_one_table(const char *db_name_arg,
790
const char *table_name_arg,
791
enum thr_lock_type lock_type_arg)
793
memset(this, 0, sizeof(*this));
794
db= (char*) db_name_arg;
795
table_name= alias= (char*) table_name_arg;
796
lock_type= lock_type_arg;
800
List of tables local to a subquery (used by SQL_LIST). Considers
801
views as leaves (unlike 'next_leaf' below). Created at parse time
802
in st_select_lex::add_table_to_list() -> table_list.link_in_list().
804
TABLE_LIST *next_local;
805
/* link in a global list of all queries tables */
806
TABLE_LIST *next_global, **prev_global;
807
char *db, *alias, *table_name, *schema_table_name;
808
char *option; /* Used by cache index */
809
Item *on_expr; /* Used with outer join */
812
(Valid only for semi-join nests) Bitmap of tables that are within the
813
semi-join (this is different from bitmap of all nest's children because
814
tables that were pulled out of the semi-join nest remain listed as
817
table_map sj_inner_tables;
818
/* Number of IN-compared expressions */
821
The structure of ON expression presented in the member above
822
can be changed during certain optimizations. This member
823
contains a snapshot of AND-OR structure of the ON expression
824
made after permanent transformations of the parse tree, and is
825
used to restore ON clause before every reexecution of a prepared
826
statement or stored procedure.
829
COND_EQUAL *cond_equal; /* Used with outer join */
831
During parsing - left operand of NATURAL/USING join where 'this' is
832
the right operand. After parsing (this->natural_join == this) iff
833
'this' represents a NATURAL or USING join operation. Thus after
834
parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
836
TABLE_LIST *natural_join;
838
True if 'this' represents a nested join that is a NATURAL JOIN.
839
For one of the operands of 'this', the member 'natural_join' points
840
to the other operand of 'this'.
842
bool is_natural_join;
843
/* Field names in a USING clause for JOIN ... USING. */
844
List<String> *join_using_fields;
846
Explicitly store the result columns of either a NATURAL/USING join or
847
an operand of such a join.
849
List<Natural_join_column> *join_columns;
850
/* true if join_columns contains all columns of this table reference. */
851
bool is_join_columns_complete;
854
List of nodes in a nested join tree, that should be considered as
855
leaves with respect to name resolution. The leaves are: views,
856
top-most nodes representing NATURAL/USING joins, subqueries, and
857
base tables. All of these TABLE_LIST instances contain a
858
materialized list of columns. The list is local to a subquery.
860
TABLE_LIST *next_name_resolution_table;
861
/* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
862
List<Index_hint> *index_hints;
863
TABLE *table; /* opened table */
864
uint table_id; /* table id (from binlog) for opened table */
866
select_result for derived table to pass it from table creation to table
869
select_union *derived_result;
871
Reference from aux_tables to local list entry of main select of
872
multi-delete statement:
873
delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
874
here it will be reference of first occurrence of t1 to second (as you
875
can see this lists can't be merged)
877
TABLE_LIST *correspondent_table;
878
st_select_lex_unit *derived; /* SELECT_LEX_UNIT of derived table */
879
ST_SCHEMA_TABLE *schema_table; /* Information_schema table */
880
st_select_lex *schema_select_lex;
882
True when the view field translation table is used to convert
883
schema table fields for backwards compatibility with SHOW command.
885
bool schema_table_reformed;
886
TMP_TABLE_PARAM *schema_table_param;
887
/* link to select_lex where this table was used */
888
st_select_lex *select_lex;
889
Field_translator *field_translation; /* array of VIEW fields */
890
/* pointer to element after last one in translation table above */
891
Field_translator *field_translation_end;
893
List (based on next_local) of underlying tables of this view. I.e. it
894
does not include the tables of subqueries used in the view. Is set only
897
TABLE_LIST *merge_underlying_list;
900
- in case of the view it is the list of all (not only underlying
901
tables but also used in subquery ones) tables of the view.
903
List<TABLE_LIST> *view_tables;
904
/* most upper view this table belongs to */
905
TABLE_LIST *belong_to_view;
906
/* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
907
TABLE_LIST *parent_l;
909
List of all base tables local to a subquery including all view
910
tables. Unlike 'next_local', this in this list views are *not*
911
leaves. Created in setup_tables() -> make_leaves_list().
913
TABLE_LIST *next_leaf;
914
/* data need by some engines in query cache*/
915
uint64_t engine_data;
916
/* call back function for asking handler about caching in query cache */
917
qc_engine_callback callback_func;
918
thr_lock_type lock_type;
919
uint outer_join; /* Which join type */
920
uint shared; /* Used in multi-upd */
922
size_t table_name_length;
923
bool straight; /* optimize with prev table */
924
bool updating; /* for replicate-do/ignore table */
925
bool force_index; /* prefer index over table scan */
926
bool ignore_leaves; /* preload only non-leaf nodes */
927
table_map dep_tables; /* tables the table depends on */
928
table_map on_expr_dep_tables; /* tables on expression depends on */
929
struct st_nested_join *nested_join; /* if the element is a nested join */
930
TABLE_LIST *embedding; /* nested join containing the table */
931
List<TABLE_LIST> *join_list;/* join list the table belongs to */
932
bool cacheable_table; /* stop PS caching */
933
/* FRMTYPE_ERROR if any type is acceptable */
934
enum frm_type_enum required_type;
935
handlerton *db_type; /* table_type for handler */
936
char timestamp_buffer[20]; /* buffer for timestamp (19+1) */
938
This TABLE_LIST object corresponds to the table to be created
939
so it is possible that it does not exist (used in CREATE TABLE
940
... SELECT implementation).
943
/* For transactional locking. */
944
int lock_timeout; /* NOWAIT or WAIT [X] */
945
bool lock_transactional; /* If transactional lock requested. */
946
bool internal_tmp_table;
947
/** true if an alias for this table was specified in the SQL. */
949
/** true if the table is referred to in the statement using a fully
950
qualified name (<db_name>.<table_name>).
954
uint i_s_requested_object;
955
bool has_db_lookup_value;
956
bool has_table_lookup_value;
957
uint table_open_method;
958
enum enum_schema_table_state schema_table_state;
959
void set_underlying_merge();
960
bool setup_underlying(THD *thd);
961
void cleanup_items();
963
If you change placeholder(), please check the condition in
964
check_transactional_lock() too.
968
return derived || schema_table || (create && !table->db_stat) || !table;
970
void print(THD *thd, String *str, enum_query_type query_type);
971
bool set_insert_values(MEM_ROOT *mem_root);
972
TABLE_LIST *find_underlying_table(TABLE *table);
973
TABLE_LIST *first_leaf_for_name_resolution();
974
TABLE_LIST *last_leaf_for_name_resolution();
975
bool is_leaf_for_name_resolution();
976
inline TABLE_LIST *top_table()
977
{ return belong_to_view ? belong_to_view : this; }
980
Cleanup for re-execution in a prepared statement or a stored
983
void reinit_before_use(THD *thd);
984
Item_subselect *containing_subselect();
987
Compiles the tagged hints list and fills up st_table::keys_in_use_for_query,
988
st_table::keys_in_use_for_group_by, st_table::keys_in_use_for_order_by,
989
st_table::force_index and st_table::covering_keys.
991
bool process_index_hints(TABLE *table);
994
bool prep_where(THD *thd, Item **conds, bool no_where_clause);
996
Cleanup for re-execution in a prepared statement or a stored
1004
Iterator over the fields of a generic table reference.
1007
class Field_iterator: public Sql_alloc
1010
Field_iterator() {} /* Remove gcc warning */
1011
virtual ~Field_iterator() {}
1012
virtual void set(TABLE_LIST *)= 0;
1013
virtual void next()= 0;
1014
virtual bool end_of_fields()= 0; /* Return 1 at end of list */
1015
virtual const char *name()= 0;
1016
virtual Item *create_item(THD *)= 0;
1017
virtual Field *field()= 0;
1022
Iterator over the fields of a base table, view with temporary
1026
class Field_iterator_table: public Field_iterator
1030
Field_iterator_table() :ptr(0) {}
1031
void set(TABLE_LIST *table) { ptr= table->table->field; }
1032
void set_table(TABLE *table) { ptr= table->field; }
1033
void next() { ptr++; }
1034
bool end_of_fields() { return *ptr == 0; }
1036
Item *create_item(THD *thd);
1037
Field *field() { return *ptr; }
1041
/* Iterator over the fields of a merge view. */
1043
class Field_iterator_view: public Field_iterator
1045
Field_translator *ptr, *array_end;
1048
Field_iterator_view() :ptr(0), array_end(0) {}
1049
void set(TABLE_LIST *table);
1050
void next() { ptr++; }
1051
bool end_of_fields() { return ptr == array_end; }
1053
Item *create_item(THD *thd);
1054
Item **item_ptr() {return &ptr->item; }
1055
Field *field() { return 0; }
1056
inline Item *item() { return ptr->item; }
1057
Field_translator *field_translator() { return ptr; }
1062
Field_iterator interface to the list of materialized fields of a
1066
class Field_iterator_natural_join: public Field_iterator
1068
List_iterator_fast<Natural_join_column> column_ref_it;
1069
Natural_join_column *cur_column_ref;
1071
Field_iterator_natural_join() :cur_column_ref(NULL) {}
1072
~Field_iterator_natural_join() {}
1073
void set(TABLE_LIST *table);
1075
bool end_of_fields() { return !cur_column_ref; }
1076
const char *name() { return cur_column_ref->name(); }
1077
Item *create_item(THD *thd) { return cur_column_ref->create_item(thd); }
1078
Field *field() { return cur_column_ref->field(); }
1079
Natural_join_column *column_ref() { return cur_column_ref; }
1084
Generic iterator over the fields of an arbitrary table reference.
1087
This class unifies the various ways of iterating over the columns
1088
of a table reference depending on the type of SQL entity it
1089
represents. If such an entity represents a nested table reference,
1090
this iterator encapsulates the iteration over the columns of the
1091
members of the table reference.
1094
The implementation assumes that all underlying NATURAL/USING table
1095
references already contain their result columns and are linked into
1096
the list TABLE_LIST::next_name_resolution_table.
1099
class Field_iterator_table_ref: public Field_iterator
1101
TABLE_LIST *table_ref, *first_leaf, *last_leaf;
1102
Field_iterator_table table_field_it;
1103
Field_iterator_view view_field_it;
1104
Field_iterator_natural_join natural_join_it;
1105
Field_iterator *field_it;
1106
void set_field_iterator();
1108
Field_iterator_table_ref() :field_it(NULL) {}
1109
void set(TABLE_LIST *table);
1111
bool end_of_fields()
1112
{ return (table_ref == last_leaf && field_it->end_of_fields()); }
1113
const char *name() { return field_it->name(); }
1114
const char *table_name();
1115
const char *db_name();
1116
Item *create_item(THD *thd) { return field_it->create_item(thd); }
1117
Field *field() { return field_it->field(); }
1118
Natural_join_column *get_or_create_column_ref(TABLE_LIST *parent_table_ref);
1119
Natural_join_column *get_natural_column_ref();
1123
typedef struct st_nested_join
1125
List<TABLE_LIST> join_list; /* list of elements in the nested join */
1126
table_map used_tables; /* bitmap of tables in the nested join */
1127
table_map not_null_tables; /* tables that rejects nulls */
1128
struct st_join_table *first_nested;/* the first nested table in the plan */
1130
Used to count tables in the nested join in 2 isolated places:
1131
1. In make_outerjoin_info().
1132
2. check_interleaving_with_nj/restore_prev_nj_state (these are called
1133
by the join optimizer.
1134
Before each use the counters are zeroed by reset_nj_counters.
1137
nested_join_map nj_map; /* Bit used to identify this nested join*/
1139
(Valid only for semi-join nests) Bitmap of tables outside the semi-join
1140
that are used within the semi-join's ON condition.
1142
table_map sj_depends_on;
1143
/* Outer non-trivially correlated tables */
1144
table_map sj_corr_tables;
1145
List<Item> sj_outer_expr_list;
724
1149
typedef struct st_changed_table_list
726
1151
struct st_changed_table_list *next;
728
1153
uint32_t key_length;
732
typedef struct st_open_table_list
1154
} CHANGED_TABLE_LIST;
1157
typedef struct st_open_table_list{
734
1158
struct st_open_table_list *next;
735
1159
char *db,*table;
736
1160
uint32_t in_use,locked;
740
#endif /* DRIZZLED_TABLE_H */
1163
typedef struct st_table_field_w_type
1168
} TABLE_FIELD_W_TYPE;
1172
table_check_intact(TABLE *table, const uint table_f_count,
1173
const TABLE_FIELD_W_TYPE *table_def);
1175
static inline my_bitmap_map *tmp_use_all_columns(TABLE *table,
1178
my_bitmap_map *old= bitmap->bitmap;
1179
bitmap->bitmap= table->s->all_set.bitmap;
1184
static inline void tmp_restore_column_map(MY_BITMAP *bitmap,
1187
bitmap->bitmap= old;
1190
/* The following is only needed for debugging */
1192
static inline my_bitmap_map *dbug_tmp_use_all_columns(TABLE *table __attribute__((unused)),
1193
MY_BITMAP *bitmap __attribute__((unused)))
1198
static inline void dbug_tmp_restore_column_map(MY_BITMAP *bitmap __attribute__((unused)),
1199
my_bitmap_map *old __attribute__((unused)))
1204
size_t max_row_length(TABLE *table, const uchar *data);