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
Select_Lex_Unit *unit= orig_table_list->derived;
98
SELECT_LEX_UNIT *unit= orig_table_list->derived;
98
99
uint64_t create_options;
102
Select_Lex *first_select= unit->first_select();
103
SELECT_LEX *first_select= unit->first_select();
104
105
select_union *derived_result;
106
107
/* prevent name resolving out of derived table */
107
for (Select_Lex *sl= first_select; sl; sl= sl->next_select())
108
for (SELECT_LEX *sl= first_select; sl; sl= sl->next_select())
108
109
sl->context.outer_context= 0;
110
111
if (!(derived_result= new select_union))
111
112
return(true); // out of memory
113
// Select_Lex_Unit::prepare correctly work for single select
114
// st_select_lex_unit::prepare correctly work for single select
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
Temp table is created so that it hounours if UNION without ALL is to be
121
Temp table is created so that it hounours if UNION without ALL is to be
122
124
As 'distinct' parameter we always pass false (0), because underlying
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
Select_Lex_Unit *unit= orig_table_list->derived;
203
SELECT_LEX_UNIT *unit= orig_table_list->derived;
197
206
/*check that table creation pass without problem and it is derived table */
198
207
if (table && unit)
200
Select_Lex *first_select= unit->first_select();
209
SELECT_LEX *first_select= unit->first_select();
201
210
select_union *derived_result= orig_table_list->derived_result;
202
Select_Lex *save_current_select= lex->current_select;
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