12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
18
18
These were introduced by Sinisa <sinisa@mysql.com>
22
#include <drizzled/sql_lex.h>
23
#include <drizzled/select_union.h>
20
#include <drizzled/server_includes.h>
24
21
#include <drizzled/sql_select.h>
25
#include <drizzled/session.h>
31
24
Call given derived table processor (preparing or filling tables)
27
mysql_handle_derived()
35
28
lex LEX for this thread
36
29
processor procedure of derived table processing
42
bool handle_derived(LEX *lex, bool (*processor)(Session*, LEX*, TableList*))
36
mysql_handle_derived(LEX *lex, bool (*processor)(Session*, LEX*, TableList*))
45
39
if (lex->derived_tables)
47
41
lex->session->derived_tables_processing= true;
48
for (Select_Lex *sl= lex->all_selects_list; sl; sl= sl->next_select_in_list())
42
for (Select_Lex *sl= lex->all_selects_list;
44
sl= sl->next_select_in_list())
50
for (TableList *cursor= sl->get_table_list(); cursor; cursor= cursor->next_local)
46
for (TableList *cursor= sl->get_table_list();
48
cursor= cursor->next_local)
52
if ((res= (*processor)(lex->session, lex, cursor)))
50
if ((res= (*processor)(lex->session, lex, cursor)))
58
Force join->join_tmp creation, because we will use this JOIN
59
twice for EXPLAIN and we have to have unchanged join for EXPLAINing
61
sl->uncacheable.set(UNCACHEABLE_EXPLAIN);
62
sl->master_unit()->uncacheable.set(UNCACHEABLE_EXPLAIN);
56
Force join->join_tmp creation, because we will use this JOIN
57
twice for EXPLAIN and we have to have unchanged join for EXPLAINing
59
sl->uncacheable|= UNCACHEABLE_EXPLAIN;
60
sl->master_unit()->uncacheable|= UNCACHEABLE_EXPLAIN;
95
bool derived_prepare(Session *session, LEX *, TableList *orig_table_list)
95
bool mysql_derived_prepare(Session *session, LEX *,
96
TableList *orig_table_list)
97
98
Select_Lex_Unit *unit= orig_table_list->derived;
98
99
uint64_t create_options;
114
115
if ((res= unit->prepare(session, derived_result, 0)))
117
create_options= (first_select->options | session->options | TMP_TABLE_ALL_COLUMNS);
118
create_options= (first_select->options | session->options |
119
TMP_TABLE_ALL_COLUMNS);
119
121
Temp table is created so that it hounours if UNION without ALL is to be
128
130
if ((res= derived_result->create_result_table(session, &unit->types, false,
130
orig_table_list->alias)))
132
orig_table_list->alias,
133
136
table= derived_result->table;
147
table->free_tmp_table(session);
147
148
delete derived_result;
152
if (!session->fill_derived_tables())
154
delete derived_result;
155
derived_result= NULL;
151
157
orig_table_list->derived_result= derived_result;
152
158
orig_table_list->table= table;
153
orig_table_list->setTableName(const_cast<char *>(table->getShare()->getTableName()));
154
orig_table_list->table_name_length= table->getShare()->getTableNameSize();
159
orig_table_list->table_name= table->s->table_name.str;
160
orig_table_list->table_name_length= table->s->table_name.length;
155
161
table->derived_select_number= first_select->select_number;
156
orig_table_list->setSchemaName((char *)"");
162
table->s->tmp_table= NON_TRANSACTIONAL_TMP_TABLE;
163
orig_table_list->db= (char *)"";
157
164
orig_table_list->db_length= 0;
158
/* Force read of table stats in the optimizer */
159
table->cursor->info(HA_STATUS_VARIABLE);
165
// Force read of table stats in the optimizer
166
table->file->info(HA_STATUS_VARIABLE);
160
167
/* Add new temporary table to list of open derived tables */
161
table->setNext(session->getDerivedTables());
162
session->setDerivedTables(table);
168
table->next= session->derived_tables;
169
session->derived_tables= table;
170
178
fill derived table
181
mysql_derived_filling()
174
182
session Thread handle
175
183
lex LEX for this thread
176
184
unit node that contains all SELECT's for derived tables
191
bool derived_filling(Session *session, LEX *lex, TableList *orig_table_list)
200
bool mysql_derived_filling(Session *session, LEX *lex, TableList *orig_table_list)
193
202
Table *table= orig_table_list->table;
194
203
Select_Lex_Unit *unit= orig_table_list->derived;
202
211
Select_Lex *save_current_select= lex->current_select;
203
212
if (unit->is_union())
205
/* execute union without clean up */
214
// execute union without clean up
206
215
res= unit->exec();
210
219
unit->set_limit(first_select);
211
220
if (unit->select_limit_cnt == HA_POS_ERROR)
212
first_select->options&= ~OPTION_FOUND_ROWS;
221
first_select->options&= ~OPTION_FOUND_ROWS;
214
223
lex->current_select= first_select;
215
res= select_query(session, &first_select->ref_pointer_array,
216
(TableList*) first_select->table_list.first,
217
first_select->with_wild,
218
first_select->item_list, first_select->where,
219
(first_select->order_list.elements+
220
first_select->group_list.elements),
221
(Order *) first_select->order_list.first,
222
(Order *) first_select->group_list.first,
223
first_select->having,
224
(first_select->options | session->options | SELECT_NO_UNLOCK),
225
derived_result, unit, first_select);
224
res= mysql_select(session, &first_select->ref_pointer_array,
225
(TableList*) first_select->table_list.first,
226
first_select->with_wild,
227
first_select->item_list, first_select->where,
228
(first_select->order_list.elements+
229
first_select->group_list.elements),
230
(order_st *) first_select->order_list.first,
231
(order_st *) first_select->group_list.first,
232
first_select->having, (order_st*) NULL,
233
(first_select->options | session->options |
235
derived_result, unit, first_select);
231
241
Here we entirely fix both TableList and list of SELECT's as