21 #include <drizzled/field_iterator.h>
22 #include <drizzled/table_list.h>
23 #include <drizzled/session.h>
24 #include <drizzled/sql_lex.h>
25 #include <drizzled/table.h>
29 const char *Field_iterator_table::name()
const
31 return (*ptr)->field_name;
35 void Field_iterator_table::set(TableList *table)
37 ptr= table->
table->getFields();
41 void Field_iterator_table::set_table(Table *table)
43 ptr= table->getFields();
47 Item *Field_iterator_table::create_item(Session *session)
49 return new Item_field(session, &session->lex().current_select->context, *ptr);
53 void Field_iterator_natural_join::set(TableList *table_ref)
55 assert(table_ref->join_columns);
56 column_ref_it= table_ref->join_columns->begin();
57 cur_column_ref= column_ref_it++;
61 void Field_iterator_natural_join::next()
63 cur_column_ref= column_ref_it++;
64 assert(!cur_column_ref || ! cur_column_ref->table_field ||
65 cur_column_ref->table_ref->
table ==
66 cur_column_ref->table_field->getTable());
70 void Field_iterator_table_ref::set_field_iterator()
79 if (table_ref->is_join_columns_complete)
81 field_it= &natural_join_it;
86 assert(table_ref->table);
87 field_it= &table_field_it;
89 field_it->set(table_ref);
94 void Field_iterator_table_ref::set(TableList *table)
99 assert(first_leaf && last_leaf);
100 table_ref= first_leaf;
101 set_field_iterator();
105 void Field_iterator_table_ref::next()
113 if (field_it->end_of_fields() && table_ref != last_leaf)
115 table_ref= table_ref->next_name_resolution_table;
117 set_field_iterator();
122 const char *Field_iterator_table_ref::table_name()
124 if (table_ref->is_natural_join)
125 return natural_join_it.column_ref()->table_name();
127 assert(!strcmp(table_ref->getTableName(),
128 table_ref->table->getShare()->getTableName()));
129 return table_ref->getTableName();
133 const char *Field_iterator_table_ref::db_name()
135 if (table_ref->is_natural_join)
136 return natural_join_it.column_ref()->db_name();
142 assert(!strcmp(table_ref->getSchemaName(), table_ref->table->getShare()->getSchemaName()));
143 return table_ref->getSchemaName();
185 Natural_join_column *
186 Field_iterator_table_ref::get_or_create_column_ref(TableList *parent_table_ref)
188 Natural_join_column *nj_col;
189 bool is_created=
true;
190 uint32_t field_count=0;
191 TableList *add_table_ref= parent_table_ref ?
192 parent_table_ref : table_ref;
194 if (field_it == &table_field_it)
197 Field *tmp_field= table_field_it.field();
198 nj_col=
new Natural_join_column(tmp_field, table_ref);
199 field_count= table_ref->table->getShare()->sizeFields();
208 assert(table_ref->is_join_columns_complete);
210 nj_col= natural_join_it.column_ref();
213 assert(!nj_col->table_field ||
214 nj_col->table_ref->table == nj_col->table_field->getTable());
224 assert(!add_table_ref->is_join_columns_complete);
225 if (!add_table_ref->join_columns)
228 add_table_ref->join_columns=
new List<Natural_join_column>;
229 add_table_ref->is_join_columns_complete=
false;
231 add_table_ref->join_columns->push_back(nj_col);
239 if (!parent_table_ref &&
240 add_table_ref->join_columns->size() == field_count)
241 add_table_ref->is_join_columns_complete=
true;
264 Natural_join_column *
265 Field_iterator_table_ref::get_natural_column_ref()
267 assert(field_it == &natural_join_it);
273 Natural_join_column* nj_col= natural_join_it.column_ref();
274 assert(nj_col && (!nj_col->table_field || nj_col->table_ref->table == nj_col->table_field->getTable()));
TODO: Rename this file - func.h is stupid.
Table * table
opened table
TableList * first_leaf_for_name_resolution()
TableList * last_leaf_for_name_resolution()