~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>
1 by brian
clean slate
26
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
27
namespace drizzled
28
{
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
110
    if (!(derived_result= new select_union))
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
111
      return(true); // out of memory
1 by brian
clean slate
112
848 by Brian Aker
typdef class removal (just... use the name of the class).
113
    // Select_Lex_Unit::prepare correctly work for single select
520.1.22 by Brian Aker
Second pass of thd cleanup
114
    if ((res= unit->prepare(session, derived_result, 0)))
1 by brian
clean slate
115
      goto exit;
116
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
117
    create_options= (first_select->options | session->options | TMP_TABLE_ALL_COLUMNS);
1 by brian
clean slate
118
    /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
119
      Temp table is created so that it hounours if UNION without ALL is to be
1 by brian
clean slate
120
      processed
121
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
122
      As 'distinct' parameter we always pass false (0), because underlying
1 by brian
clean slate
123
      query will control distinct condition by itself. Correct test of
124
      distinct underlying query will be is_union &&
125
      !unit->union_distinct->next_select() (i.e. it is union and last distinct
126
      SELECT is last SELECT of UNION).
127
    */
520.1.22 by Brian Aker
Second pass of thd cleanup
128
    if ((res= derived_result->create_result_table(session, &unit->types, false,
1 by brian
clean slate
129
                                                  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.
130
                                                  orig_table_list->alias)))
1 by brian
clean slate
131
      goto exit;
132
133
    table= derived_result->table;
134
135
exit:
136
    /*
137
      if it is preparation PS only or commands that need only VIEW structure
138
      then we do not need real data and we can skip execution (and parameters
139
      is not defined, too)
140
    */
141
    if (res)
142
    {
143
      if (table)
1532.1.1 by Brian Aker
Merge of change to flip table instance to be share instance
144
      {
145
        table= 0;
146
      }
1 by brian
clean slate
147
      delete derived_result;
148
    }
149
    else
150
    {
151
      orig_table_list->derived_result= derived_result;
152
      orig_table_list->table= table;
1874.1.2 by Brian Aker
Encapsulate table_name from table_list.
153
      orig_table_list->setTableName(const_cast<char *>(table->getShare()->getTableName()));
1532.1.15 by Brian Aker
Partial encapsulation of TableShare from Table.
154
      orig_table_list->table_name_length= table->getShare()->getTableNameSize();
1 by brian
clean slate
155
      table->derived_select_number= first_select->select_number;
1874.1.1 by Brian Aker
Encapsulate schema_name it table_list.
156
      orig_table_list->setSchemaName((char *)"");
1 by brian
clean slate
157
      orig_table_list->db_length= 0;
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
158
      /* Force read of table stats in the optimizer */
1208.3.2 by brian
Update for Cursor renaming.
159
      table->cursor->info(HA_STATUS_VARIABLE);
1 by brian
clean slate
160
      /* Add new temporary table to list of open derived tables */
1923.1.3 by Brian Aker
Encapsulate derived tables
161
      table->setNext(session->getDerivedTables());
162
      session->setDerivedTables(table);
1 by brian
clean slate
163
    }
164
  }
165
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
166
  return(res);
1 by brian
clean slate
167
}
168
169
/*
170
  fill derived table
171
172
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
173
    derived_filling()
520.1.22 by Brian Aker
Second pass of thd cleanup
174
    session			Thread handle
1 by brian
clean slate
175
    lex                 LEX for this thread
176
    unit                node that contains all SELECT's for derived tables
327.2.4 by Brian Aker
Refactoring table.h
177
    orig_table_list     TableList for the upper SELECT
1 by brian
clean slate
178
179
  IMPLEMENTATION
180
    Derived table is resolved with temporary table. It is created based on the
181
    queries defined. After temporary table is filled, if this is not EXPLAIN,
182
    then the entire unit / node is deleted. unit is deleted if UNION is used
183
    for derived table and node is deleted is it is a  simple SELECT.
184
    If you use this function, make sure it's not called at prepare.
185
    Due to evaluation of LIMIT clause it can not be used at prepared stage.
186
187
  RETURN
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
188
    false  OK
189
    true   Error
1 by brian
clean slate
190
*/
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
191
bool derived_filling(Session *session, LEX *lex, TableList *orig_table_list)
1 by brian
clean slate
192
{
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
193
  Table *table= orig_table_list->table;
848 by Brian Aker
typdef class removal (just... use the name of the class).
194
  Select_Lex_Unit *unit= orig_table_list->derived;
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
195
  bool res= false;
1 by brian
clean slate
196
197
  /*check that table creation pass without problem and it is derived table */
198
  if (table && unit)
199
  {
846 by Brian Aker
Removing on typedeffed class.
200
    Select_Lex *first_select= unit->first_select();
1 by brian
clean slate
201
    select_union *derived_result= orig_table_list->derived_result;
846 by Brian Aker
Removing on typedeffed class.
202
    Select_Lex *save_current_select= lex->current_select;
1 by brian
clean slate
203
    if (unit->is_union())
204
    {
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
205
      /* execute union without clean up */
1 by brian
clean slate
206
      res= unit->exec();
207
    }
208
    else
209
    {
210
      unit->set_limit(first_select);
211
      if (unit->select_limit_cnt == HA_POS_ERROR)
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
212
	      first_select->options&= ~OPTION_FOUND_ROWS;
1 by brian
clean slate
213
214
      lex->current_select= first_select;
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
215
      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
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),
1892.3.3 by tdavies
struct order_st changed and renamed to c++ class named:Order
221
                        (Order *) first_select->order_list.first,
222
                        (Order *) first_select->group_list.first,
923.1.10 by Brian Aker
Remove dead code around old procedures.
223
                        first_select->having,
224
                        (first_select->options | session->options | SELECT_NO_UNLOCK),
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
225
                        derived_result, unit, first_select);
1 by brian
clean slate
226
    }
227
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
228
    if (! res)
1 by brian
clean slate
229
    {
230
      /*
327.2.4 by Brian Aker
Refactoring table.h
231
        Here we entirely fix both TableList and list of SELECT's as
1 by brian
clean slate
232
        there were no derived tables
233
      */
234
      if (derived_result->flush())
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
235
        res= true;
1 by brian
clean slate
236
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
237
      if (! lex->describe)
1 by brian
clean slate
238
        unit->cleanup();
239
    }
240
    else
241
      unit->cleanup();
242
    lex->current_select= save_current_select;
243
  }
244
  return res;
245
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
246
247
} /* namespace drizzled */