~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2002-2003 MySQL AB
2
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.
6
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.
11
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
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
1 by brian
clean slate
15
16
/*
17
  Derived tables
18
  These were introduced by Sinisa <sinisa@mysql.com>
19
*/
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
20
#include <config.h>
2154.2.17 by Brian Aker
Additional removal of session
21
2154.2.18 by Brian Aker
Merge in all changes for include files.
22
#include <drizzled/sql_lex.h>
2154.2.17 by Brian Aker
Additional removal of session
23
#include <drizzled/select_union.h>
2154.2.18 by Brian Aker
Merge in all changes for include files.
24
#include <drizzled/sql_select.h>
25
#include <drizzled/session.h>
2263.3.11 by Olaf van der Spek
Open Tables
26
#include <drizzled/open_tables_state.h>
1 by brian
clean slate
27
2318.6.57 by Olaf van der Spek
Refactor
28
namespace drizzled {
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
29
1 by brian
clean slate
30
/*
31
  Call given derived table processor (preparing or filling tables)
32
33
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
34
    handle_derived()
1 by brian
clean slate
35
    lex                 LEX for this thread
36
    processor           procedure of derived table processing
37
38
  RETURN
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
39
    false  OK
40
    true   Error
1 by brian
clean slate
41
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
42
bool handle_derived(LEX *lex, bool (*processor)(Session*, LEX*, TableList*))
1 by brian
clean slate
43
{
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
44
  bool res= false;
1 by brian
clean slate
45
  if (lex->derived_tables)
46
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
47
    lex->session->derived_tables_processing= true;
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
48
    for (Select_Lex *sl= lex->all_selects_list; sl; sl= sl->next_select_in_list())
1 by brian
clean slate
49
    {
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
50
      for (TableList *cursor= sl->get_table_list(); cursor; cursor= cursor->next_local)
1 by brian
clean slate
51
      {
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
52
        if ((res= (*processor)(lex->session, lex, cursor)))
53
          goto out;
1 by brian
clean slate
54
      }
55
      if (lex->describe)
56
      {
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
57
        /*
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
60
        */
1858.1.1 by Padraig O'Sullivan
Replaced a uint8_t member with a standard bitset since it was being used as a bitset....
61
        sl->uncacheable.set(UNCACHEABLE_EXPLAIN);
62
        sl->master_unit()->uncacheable.set(UNCACHEABLE_EXPLAIN);
1 by brian
clean slate
63
      }
64
    }
65
  }
66
out:
520.1.22 by Brian Aker
Second pass of thd cleanup
67
  lex->session->derived_tables_processing= false;
1 by brian
clean slate
68
  return res;
69
}
70
71
/*
72
  Create temporary table structure (but do not fill it)
73
74
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
75
    derived_prepare()
520.1.22 by Brian Aker
Second pass of thd cleanup
76
    session			Thread handle
1 by brian
clean slate
77
    lex                 LEX for this thread
327.2.4 by Brian Aker
Refactoring table.h
78
    orig_table_list     TableList for the upper SELECT
1 by brian
clean slate
79
80
  IMPLEMENTATION
81
    Derived table is resolved with temporary table.
82
327.2.4 by Brian Aker
Refactoring table.h
83
    After table creation, the above TableList is updated with a new table.
1 by brian
clean slate
84
85
    This function is called before any command containing derived table
86
    is executed.
87
520.1.22 by Brian Aker
Second pass of thd cleanup
88
    Derived tables is stored in session->derived_tables and freed in
1 by brian
clean slate
89
    close_thread_tables()
90
91
  RETURN
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
92
    false  OK
93
    true   Error
1 by brian
clean slate
94
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
95
bool derived_prepare(Session *session, LEX *, TableList *orig_table_list)
1 by brian
clean slate
96
{
848 by Brian Aker
typdef class removal (just... use the name of the class).
97
  Select_Lex_Unit *unit= orig_table_list->derived;
151 by Brian Aker
Ulonglong to uint64_t
98
  uint64_t create_options;
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
99
  bool res= false;
1 by brian
clean slate
100
  if (unit)
101
  {
846 by Brian Aker
Removing on typedeffed class.
102
    Select_Lex *first_select= unit->first_select();
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
103
    Table *table= 0;
1 by brian
clean slate
104
    select_union *derived_result;
105
106
    /* prevent name resolving out of derived table */
846 by Brian Aker
Removing on typedeffed class.
107
    for (Select_Lex *sl= first_select; sl; sl= sl->next_select())
1 by brian
clean slate
108
      sl->context.outer_context= 0;
109
2318.6.57 by Olaf van der Spek
Refactor
110
    derived_result= new select_union;
1 by brian
clean slate
111
848 by Brian Aker
typdef class removal (just... use the name of the class).
112
    // Select_Lex_Unit::prepare correctly work for single select
520.1.22 by Brian Aker
Second pass of thd cleanup
113
    if ((res= unit->prepare(session, derived_result, 0)))
1 by brian
clean slate
114
      goto exit;
115
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
116
    create_options= (first_select->options | session->options | TMP_TABLE_ALL_COLUMNS);
1 by brian
clean slate
117
    /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
118
      Temp table is created so that it hounours if UNION without ALL is to be
1 by brian
clean slate
119
      processed
120
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
121
      As 'distinct' parameter we always pass false (0), because underlying
1 by brian
clean slate
122
      query will control distinct condition by itself. Correct test of
123
      distinct underlying query will be is_union &&
124
      !unit->union_distinct->next_select() (i.e. it is union and last distinct
125
      SELECT is last SELECT of UNION).
126
    */
520.1.22 by Brian Aker
Second pass of thd cleanup
127
    if ((res= derived_result->create_result_table(session, &unit->types, false,
1 by brian
clean slate
128
                                                  create_options,
1273.2.2 by Stewart Smith
it turns out that bit_fields_as_long in tmp_table_param is in fact unused. remove it.
129
                                                  orig_table_list->alias)))
1 by brian
clean slate
130
      goto exit;
131
132
    table= derived_result->table;
133
134
exit:
135
    /*
136
      if it is preparation PS only or commands that need only VIEW structure
137
      then we do not need real data and we can skip execution (and parameters
138
      is not defined, too)
139
    */
140
    if (res)
141
    {
2318.6.57 by Olaf van der Spek
Refactor
142
      table= 0;
1 by brian
clean slate
143
      delete derived_result;
144
    }
145
    else
146
    {
147
      orig_table_list->derived_result= derived_result;
148
      orig_table_list->table= table;
2385.1.9 by Olaf van der Spek
Use const char* instead of str_ref
149
      orig_table_list->setTableName(table->getShare()->getTableName());
1 by brian
clean slate
150
      table->derived_select_number= first_select->select_number;
2385.1.9 by Olaf van der Spek
Use const char* instead of str_ref
151
      orig_table_list->setSchemaName("");
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
152
      /* Force read of table stats in the optimizer */
1208.3.2 by brian
Update for Cursor renaming.
153
      table->cursor->info(HA_STATUS_VARIABLE);
1 by brian
clean slate
154
      /* Add new temporary table to list of open derived tables */
2263.3.3 by Olaf van der Spek
Use open_tables
155
      table->setNext(session->open_tables.getDerivedTables());
156
      session->open_tables.setDerivedTables(table);
1 by brian
clean slate
157
    }
158
  }
159
2318.6.55 by Olaf van der Spek
Refactor
160
  return res;
1 by brian
clean slate
161
}
162
163
/*
164
  fill derived table
165
166
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
167
    derived_filling()
520.1.22 by Brian Aker
Second pass of thd cleanup
168
    session			Thread handle
1 by brian
clean slate
169
    lex                 LEX for this thread
170
    unit                node that contains all SELECT's for derived tables
327.2.4 by Brian Aker
Refactoring table.h
171
    orig_table_list     TableList for the upper SELECT
1 by brian
clean slate
172
173
  IMPLEMENTATION
174
    Derived table is resolved with temporary table. It is created based on the
175
    queries defined. After temporary table is filled, if this is not EXPLAIN,
176
    then the entire unit / node is deleted. unit is deleted if UNION is used
177
    for derived table and node is deleted is it is a  simple SELECT.
178
    If you use this function, make sure it's not called at prepare.
179
    Due to evaluation of LIMIT clause it can not be used at prepared stage.
180
181
  RETURN
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
182
    false  OK
183
    true   Error
1 by brian
clean slate
184
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
185
bool derived_filling(Session *session, LEX *lex, TableList *orig_table_list)
1 by brian
clean slate
186
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
187
  Table *table= orig_table_list->table;
848 by Brian Aker
typdef class removal (just... use the name of the class).
188
  Select_Lex_Unit *unit= orig_table_list->derived;
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
189
  bool res= false;
1 by brian
clean slate
190
191
  /*check that table creation pass without problem and it is derived table */
192
  if (table && unit)
193
  {
846 by Brian Aker
Removing on typedeffed class.
194
    Select_Lex *first_select= unit->first_select();
1 by brian
clean slate
195
    select_union *derived_result= orig_table_list->derived_result;
846 by Brian Aker
Removing on typedeffed class.
196
    Select_Lex *save_current_select= lex->current_select;
1 by brian
clean slate
197
    if (unit->is_union())
198
    {
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
199
      /* execute union without clean up */
1 by brian
clean slate
200
      res= unit->exec();
201
    }
202
    else
203
    {
204
      unit->set_limit(first_select);
205
      if (unit->select_limit_cnt == HA_POS_ERROR)
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
206
	      first_select->options&= ~OPTION_FOUND_ROWS;
1 by brian
clean slate
207
208
      lex->current_select= first_select;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
209
      res= select_query(session, &first_select->ref_pointer_array,
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
210
                        (TableList*) first_select->table_list.first,
211
                        first_select->with_wild,
212
                        first_select->item_list, first_select->where,
213
                        (first_select->order_list.elements+
214
                        first_select->group_list.elements),
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
215
                        (Order *) first_select->order_list.first,
216
                        (Order *) first_select->group_list.first,
923.1.10 by Brian Aker
Remove dead code around old procedures.
217
                        first_select->having,
218
                        (first_select->options | session->options | SELECT_NO_UNLOCK),
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
219
                        derived_result, unit, first_select);
1 by brian
clean slate
220
    }
221
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
222
    if (! res)
1 by brian
clean slate
223
    {
224
      /*
327.2.4 by Brian Aker
Refactoring table.h
225
        Here we entirely fix both TableList and list of SELECT's as
1 by brian
clean slate
226
        there were no derived tables
227
      */
228
      if (derived_result->flush())
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
229
        res= true;
1 by brian
clean slate
230
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
231
      if (! lex->describe)
1 by brian
clean slate
232
        unit->cleanup();
233
    }
234
    else
235
      unit->cleanup();
236
    lex->current_select= save_current_select;
237
  }
238
  return res;
239
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
240
241
} /* namespace drizzled */