~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-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
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
16
#include "config.h"
17
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
18
#define DRIZZLE_LEX 1
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
19
1241.9.57 by Monty Taylor
Oy. Bigger change than I normally like - but this stuff is all intertwined.
20
#include <drizzled/my_hash.h>
549 by Monty Taylor
Took gettext.h out of header files.
21
#include <drizzled/error.h>
553.1.3 by Monty Taylor
Split out nested_join.h.
22
#include <drizzled/nested_join.h>
561.1.3 by Monty Taylor
Split some more things out of common_includes.h.
23
#include <drizzled/query_id.h>
1336.2.2 by Jay Pipes
NO CODE CHANGES - Simply moves pieces of ReplicationServices to TransactionServices. Preparation for making the ReplicationServices component only responsible for communication between replicators, appliers, publishers, and subscribers.
24
#include "drizzled/transaction_services.h"
520.8.2 by Monty Taylor
Moved sql_parse.h and sql_error.h out of common_includes.
25
#include <drizzled/sql_parse.h>
520.6.7 by Monty Taylor
Moved a bunch of crap out of common_includes.
26
#include <drizzled/data_home.h>
575.4.7 by Monty Taylor
More header cleanup.
27
#include <drizzled/sql_base.h>
28
#include <drizzled/show.h>
1235.4.23 by Stewart Smith
fix includes for drizzled/db.h. Now only in .cc files, no header files. should make modifying db.h much less painful.
29
#include <drizzled/db.h>
670.1.20 by Monty Taylor
Renamed functions to function... everything else is singular.
30
#include <drizzled/function/time/unix_timestamp.h>
31
#include <drizzled/function/get_system_var.h>
584.4.7 by Monty Taylor
Removed a big bank of includes from item.h.
32
#include <drizzled/item/cmpfunc.h>
642.1.20 by Lee
header file clean up
33
#include <drizzled/item/null.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
34
#include <drizzled/session.h>
35
#include <drizzled/sql_load.h>
670.2.4 by Monty Taylor
Removed more stuff from the headers.
36
#include <drizzled/lock.h>
837 by Brian Aker
Reworked some classes out of session.h
37
#include <drizzled/select_send.h>
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
38
#include <drizzled/plugin/client.h>
1100.3.30 by Padraig O'Sullivan
Renamed the Command class to be Statement. Renamed the command directory to
39
#include <drizzled/statement.h>
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
40
#include <drizzled/statement/alter_table.h>
1126.10.18 by Padraig O'Sullivan
Various small build fixes for when dtrace is enabled.
41
#include "drizzled/probes.h"
1966.2.5 by Brian Aker
Style change around session list.
42
#include "drizzled/session/cache.h"
1241.9.28 by Monty Taylor
Removed global_charset_info.h from server_includes.h
43
#include "drizzled/global_charset_info.h"
1100.3.1 by Padraig O'Sullivan
Beginnings of reworking the mysql_execute_command() method.
44
1130.1.12 by Monty Taylor
Moved service stuff into plugin/
45
#include "drizzled/plugin/logging.h"
1307.1.2 by Padraig O'Sullivan
Added the plugin point for the query rewriting interface.
46
#include "drizzled/plugin/query_rewrite.h"
1643.6.1 by Djellel E. Difallah
Added hook points and the interface for the Query Cache plugin
47
#include "drizzled/plugin/query_cache.h"
1317.2.6 by Monty Taylor
Prevent the user from attempting to kill a process that he is not authorized
48
#include "drizzled/plugin/authorization.h"
1240.7.1 by Padraig O'Sullivan
Created an ExplainPlan class in the optimizer namespace. All printing of an explain in drizzle goes
49
#include "drizzled/optimizer/explain_plan.h"
1241.9.31 by Monty Taylor
Moved global pthread variables into their own header.
50
#include "drizzled/pthread_globals.h"
1836 by Brian Aker
Added support for pre/post triggers (this removes the need for the current
51
#include "drizzled/plugin/event_observer.h"
1130.1.1 by Monty Taylor
Merged in plugin-slot-reorg patches.
52
1241.9.59 by Monty Taylor
Removed the first mystrings header.
53
#include <limits.h>
54
590.2.18 by Monty Taylor
Changed the bitset<32> to a bitset<5>. Made the int constants into bitset constants.
55
#include <bitset>
1067.4.4 by Nathan Williams
The rest of the files in the drizzled directory were purged of the cmin macro and replace with std::min (except for the definition in globals.h and 1 usage in stacktrace.cc).
56
#include <algorithm>
1878.10.1 by Billy Earney
removed my_micro_time, my_micro_time_and_time, along with my_getsystime and replaced with boost:date_time for compatibility between OS.
57
#include <boost/date_time.hpp>
1241.9.64 by Monty Taylor
Moved remaining non-public portions of mysys and mystrings to drizzled/internal.
58
#include "drizzled/internal/my_sys.h"
1241.9.62 by Monty Taylor
Removed plugin/myisam/myisam.h from session.h
59
590.2.18 by Monty Taylor
Changed the bitset<32> to a bitset<5>. Made the int constants into bitset constants.
60
using namespace std;
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
61
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
62
extern int DRIZZLEparse(void *session); // from sql_yacc.cc
63
64
namespace drizzled
65
{
66
1039.1.16 by Brian Aker
A lot of little cleanups (most based off lcov)
67
/* Prototypes */
1085.1.2 by Monty Taylor
Fixed -Wmissing-declarations
68
bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
1165.1.48 by Stewart Smith
make parse_sql static to sql_parse.cc
69
static bool parse_sql(Session *session, Lex_input_stream *lip);
1280.3.17 by Padraig O'Sullivan
Merged from Monty
70
void mysql_parse(Session *session, const char *inBuf, uint32_t length);
1085.1.2 by Monty Taylor
Fixed -Wmissing-declarations
71
1 by brian
clean slate
72
/**
73
  @defgroup Runtime_Environment Runtime Environment
74
  @{
75
*/
76
629.2.7 by Monty Taylor
Fixed a couple of memory buffer size issues.
77
extern size_t my_thread_stack_size;
520.6.7 by Monty Taylor
Moved a bunch of crap out of common_includes.
78
extern const CHARSET_INFO *character_set_filesystem;
1 by brian
clean slate
79
230.1.8 by Monty Taylor
Set length to catch errors in adding or removing COM_* constants.
80
const LEX_STRING command_name[COM_END+1]={
1 by brian
clean slate
81
  { C_STRING_WITH_LEN("Sleep") },
82
  { C_STRING_WITH_LEN("Quit") },
83
  { C_STRING_WITH_LEN("Init DB") },
84
  { C_STRING_WITH_LEN("Query") },
85
  { C_STRING_WITH_LEN("Shutdown") },
86
  { C_STRING_WITH_LEN("Connect") },
87
  { C_STRING_WITH_LEN("Ping") },
88
  { C_STRING_WITH_LEN("Error") }  // Last command number
89
};
90
91
const char *xa_state_names[]={
92
  "NON-EXISTING", "ACTIVE", "IDLE", "PREPARED"
93
};
94
95
/**
96
  Mark all commands that somehow changes a table.
97
98
  This is used to check number of updates / hour.
99
100
  sql_command is actually set to SQLCOM_END sometimes
101
  so we need the +1 to include it in the array.
102
103
  See COMMAND_FLAG_xxx for different type of commands
104
     2  - query that returns meaningful ROW_COUNT() -
105
          a number of modified rows
106
*/
590.2.18 by Monty Taylor
Changed the bitset<32> to a bitset<5>. Made the int constants into bitset constants.
107
bitset<CF_BIT_SIZE> sql_command_flags[SQLCOM_END+1];
1 by brian
clean slate
108
109
void init_update_queries(void)
110
{
610 by Brian Aker
Merge of Monty's (plus fix for increment style/useless +1)
111
  uint32_t x;
112
113
  for (x= 0; x <= SQLCOM_END; x++)
114
    sql_command_flags[x].reset();
1 by brian
clean slate
115
116
  sql_command_flags[SQLCOM_CREATE_TABLE]=   CF_CHANGES_DATA;
117
  sql_command_flags[SQLCOM_CREATE_INDEX]=   CF_CHANGES_DATA;
118
  sql_command_flags[SQLCOM_ALTER_TABLE]=    CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND;
119
  sql_command_flags[SQLCOM_TRUNCATE]=       CF_CHANGES_DATA | CF_WRITE_LOGS_COMMAND;
120
  sql_command_flags[SQLCOM_DROP_TABLE]=     CF_CHANGES_DATA;
121
  sql_command_flags[SQLCOM_LOAD]=           CF_CHANGES_DATA;
122
  sql_command_flags[SQLCOM_CREATE_DB]=      CF_CHANGES_DATA;
123
  sql_command_flags[SQLCOM_DROP_DB]=        CF_CHANGES_DATA;
124
  sql_command_flags[SQLCOM_RENAME_TABLE]=   CF_CHANGES_DATA;
125
  sql_command_flags[SQLCOM_DROP_INDEX]=     CF_CHANGES_DATA;
126
127
  sql_command_flags[SQLCOM_UPDATE]=	    CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
128
  sql_command_flags[SQLCOM_INSERT]=	    CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
129
  sql_command_flags[SQLCOM_INSERT_SELECT]=  CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
130
  sql_command_flags[SQLCOM_DELETE]=         CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
131
  sql_command_flags[SQLCOM_REPLACE]=        CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
132
  sql_command_flags[SQLCOM_REPLACE_SELECT]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
133
134
  sql_command_flags[SQLCOM_SHOW_WARNS]= CF_STATUS_COMMAND;
135
  sql_command_flags[SQLCOM_SHOW_ERRORS]= CF_STATUS_COMMAND;
136
  sql_command_flags[SQLCOM_SHOW_CREATE_DB]=  CF_STATUS_COMMAND;
137
  sql_command_flags[SQLCOM_SHOW_CREATE]=  CF_STATUS_COMMAND;
138
139
  /*
140
    The following admin table operations are allowed
141
    on log tables.
142
  */
143
  sql_command_flags[SQLCOM_ANALYZE]=          CF_WRITE_LOGS_COMMAND;
144
}
145
146
/**
147
  Perform one connection-level (COM_XXXX) command.
148
149
  @param command         type of command to perform
520.1.22 by Brian Aker
Second pass of thd cleanup
150
  @param session             connection handle
1 by brian
clean slate
151
  @param packet          data for the command, packet is always null-terminated
152
  @param packet_length   length of packet + 1 (to show that data is
153
                         null-terminated) except for COM_SLEEP, where it
154
                         can be zero.
155
156
  @todo
520.1.22 by Brian Aker
Second pass of thd cleanup
157
    set session->lex->sql_command to SQLCOM_END here.
1 by brian
clean slate
158
  @todo
159
    The following has to be changed to an 8 byte integer
160
161
  @retval
162
    0   ok
163
  @retval
164
    1   request of thread shutdown, i. e. if command is
165
        COM_QUIT/COM_SHUTDOWN
166
*/
520.1.22 by Brian Aker
Second pass of thd cleanup
167
bool dispatch_command(enum enum_server_command command, Session *session,
561.1.3 by Monty Taylor
Split some more things out of common_includes.h.
168
                      char* packet, uint32_t packet_length)
1 by brian
clean slate
169
{
170
  bool error= 0;
561.1.3 by Monty Taylor
Split some more things out of common_includes.h.
171
  Query_id &query_id= Query_id::get_query_id();
1 by brian
clean slate
172
1932.2.3 by Brian Aker
Updates for D-trace
173
  DRIZZLE_COMMAND_START(session->thread_id, command);
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
174
175
  session->command= command;
520.1.22 by Brian Aker
Second pass of thd cleanup
176
  session->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
177
  session->set_time();
1273.1.1 by Jay Pipes
* Changes Session::warn_id to Session::warn_query_id
178
  session->setQueryId(query_id.value());
1 by brian
clean slate
179
180
  switch( command ) {
181
  /* Ignore these statements. */
182
  case COM_PING:
183
    break;
184
  /* Increase id and count all other statements. */
185
  default:
1689.5.1 by Joseph Daly
remove increment calls
186
    session->status_var.questions++;
561.1.3 by Monty Taylor
Split some more things out of common_includes.h.
187
    query_id.next();
1 by brian
clean slate
188
  }
189
520.1.22 by Brian Aker
Second pass of thd cleanup
190
  /* TODO: set session->lex->sql_command to SQLCOM_END here */
1 by brian
clean slate
191
1130.1.16 by Monty Taylor
Fixed naming issue.
192
  plugin::Logging::preDo(session);
1836 by Brian Aker
Added support for pre/post triggers (this removes the need for the current
193
  if (unlikely(plugin::EventObserver::beforeStatement(*session)))
194
  {
195
    // We should do something about an error...
196
  }
383.6.4 by Mark Atwood
more make plug logging work
197
520.1.22 by Brian Aker
Second pass of thd cleanup
198
  session->server_status&=
1 by brian
clean slate
199
           ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED);
200
  switch (command) {
201
  case COM_INIT_DB:
202
  {
1302.4.8 by Eric Day
Added prototest test case for mysql_protocol.
203
    if (packet_length == 0)
204
    {
205
      my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
206
      break;
207
    }
208
1273.19.29 by Brian Aker
Code style cleanup.
209
    string tmp(packet, packet_length);
210
1415 by Brian Aker
Mass overhaul to use schema_identifier.
211
    SchemaIdentifier identifier(tmp);
212
213
    if (not mysql_change_db(session, identifier))
1 by brian
clean slate
214
    {
836 by Brian Aker
Fixed session call from function to method.
215
      session->my_ok();
1 by brian
clean slate
216
    }
217
    break;
218
  }
219
  case COM_QUERY:
220
  {
1921.4.2 by Brian Aker
Adding in concurrent execute support.
221
    if (not session->readAndStoreQuery(packet, packet_length))
1 by brian
clean slate
222
      break;					// fatal error is set
1932.2.3 by Brian Aker
Updates for D-trace
223
    DRIZZLE_QUERY_START(session->getQueryString()->c_str(),
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
224
                        session->thread_id,
1241.7.2 by Padraig O'Sullivan
Corrected a dtrace probe now that db is std::string and not char * in the Session class.
225
                        const_cast<const char *>(session->db.empty() ? "" : session->db.c_str()));
1 by brian
clean slate
226
1921.4.14 by Brian Aker
Update to tighten up query string.
227
    plugin::QueryRewriter::rewriteQuery(session->getSchema(), session->getQueryString());
1921.4.13 by Brian Aker
Fix issue where session info might not be correct.
228
    mysql_parse(session, session->getQueryString()->c_str(), session->getQueryString()->length());
1 by brian
clean slate
229
230
    break;
231
  }
232
  case COM_QUIT:
233
    /* We don't calculate statistics for this command */
520.1.22 by Brian Aker
Second pass of thd cleanup
234
    session->main_da.disable_status();              // Don't send anything back
55 by brian
Update for using real bool types.
235
    error=true;					// End server
1 by brian
clean slate
236
    break;
237
  case COM_SHUTDOWN:
238
  {
1689.5.1 by Joseph Daly
remove increment calls
239
    session->status_var.com_other++;
836 by Brian Aker
Fixed session call from function to method.
240
    session->my_eof();
1039.1.16 by Brian Aker
A lot of little cleanups (most based off lcov)
241
    session->close_thread_tables();			// Free before kill
575.4.4 by Yoshinori Sano
Rename mysql to drizzle.
242
    kill_drizzle();
55 by brian
Update for using real bool types.
243
    error=true;
1 by brian
clean slate
244
    break;
245
  }
246
  case COM_PING:
1689.5.1 by Joseph Daly
remove increment calls
247
    session->status_var.com_other++;
836 by Brian Aker
Fixed session call from function to method.
248
    session->my_ok();				// Tell client we are alive
1 by brian
clean slate
249
    break;
250
  case COM_SLEEP:
251
  case COM_CONNECT:				// Impossible here
252
  case COM_END:
253
  default:
254
    my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
255
    break;
256
  }
257
258
  /* If commit fails, we should be able to reset the OK status. */
520.1.22 by Brian Aker
Second pass of thd cleanup
259
  session->main_da.can_overwrite_status= true;
1273.1.2 by Jay Pipes
This patch does not change any algorithms or code paths,
260
  TransactionServices &transaction_services= TransactionServices::singleton();
1405.3.5 by Jay Pipes
TransactionServices method names now meet code style guidelines.
261
  transaction_services.autocommitOrRollback(session, session->is_error());
520.1.22 by Brian Aker
Second pass of thd cleanup
262
  session->main_da.can_overwrite_status= false;
1 by brian
clean slate
263
520.1.22 by Brian Aker
Second pass of thd cleanup
264
  session->transaction.stmt.reset();
1 by brian
clean slate
265
266
267
  /* report error issued during command execution */
520.1.22 by Brian Aker
Second pass of thd cleanup
268
  if (session->killed_errno())
269
  {
270
    if (! session->main_da.is_set())
271
      session->send_kill_message();
272
  }
1910.2.8 by Brian Aker
Enapsulate Kill.
273
  if (session->getKilled() == Session::KILL_QUERY || session->getKilled() == Session::KILL_BAD_DATA)
520.1.22 by Brian Aker
Second pass of thd cleanup
274
  {
1910.2.8 by Brian Aker
Enapsulate Kill.
275
    session->setKilled(Session::NOT_KILLED);
1689.2.26 by Brian Aker
More encapsulation of the thread var.
276
    session->setAbort(false);
520.1.22 by Brian Aker
Second pass of thd cleanup
277
  }
278
971.3.12 by Eric Day
Started abstracting Protocol, removed init_connect, init_file.
279
  /* Can not be true, but do not take chances in production. */
280
  assert(! session->main_da.is_sent);
281
282
  switch (session->main_da.status())
283
  {
284
  case Diagnostics_area::DA_ERROR:
285
    /* The query failed, send error to log and abort bootstrap. */
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
286
    session->client->sendError(session->main_da.sql_errno(),
287
                               session->main_da.message());
971.3.12 by Eric Day
Started abstracting Protocol, removed init_connect, init_file.
288
    break;
289
290
  case Diagnostics_area::DA_EOF:
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
291
    session->client->sendEOF();
971.3.12 by Eric Day
Started abstracting Protocol, removed init_connect, init_file.
292
    break;
293
294
  case Diagnostics_area::DA_OK:
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
295
    session->client->sendOK();
971.3.12 by Eric Day
Started abstracting Protocol, removed init_connect, init_file.
296
    break;
297
298
  case Diagnostics_area::DA_DISABLED:
299
    break;
300
301
  case Diagnostics_area::DA_EMPTY:
302
  default:
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
303
    session->client->sendOK();
971.3.12 by Eric Day
Started abstracting Protocol, removed init_connect, init_file.
304
    break;
305
  }
306
307
  session->main_da.is_sent= true;
520.1.22 by Brian Aker
Second pass of thd cleanup
308
309
  session->set_proc_info("closing tables");
1 by brian
clean slate
310
  /* Free tables */
1039.1.16 by Brian Aker
A lot of little cleanups (most based off lcov)
311
  session->close_thread_tables();
520.1.22 by Brian Aker
Second pass of thd cleanup
312
1130.1.16 by Monty Taylor
Fixed naming issue.
313
  plugin::Logging::postDo(session);
1836 by Brian Aker
Added support for pre/post triggers (this removes the need for the current
314
  if (unlikely(plugin::EventObserver::afterStatement(*session)))
315
  {
316
    // We should do something about an error...
317
  }
520.1.22 by Brian Aker
Second pass of thd cleanup
318
961.1.4 by Brian Aker
Remove another lock for processlist.
319
  /* Store temp state for processlist */
520.1.22 by Brian Aker
Second pass of thd cleanup
320
  session->set_proc_info("cleaning up");
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
321
  session->command= COM_SLEEP;
1921.4.13 by Brian Aker
Fix issue where session info might not be correct.
322
  session->resetQueryString();
961.1.4 by Brian Aker
Remove another lock for processlist.
323
324
  session->set_proc_info(NULL);
1487 by Brian Aker
More updates for memory::Root
325
  session->mem_root->free_root(MYF(memory::KEEP_PREALLOC));
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
326
327
  if (DRIZZLE_QUERY_DONE_ENABLED() || DRIZZLE_COMMAND_DONE_ENABLED())
328
  {
329
    if (command == COM_QUERY)
330
    {
1126.10.21 by Padraig O'Sullivan
Whoops, simple fix for a build warning that happens if the build is not
331
      DRIZZLE_QUERY_DONE(session->is_error());
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
332
    }
1126.10.21 by Padraig O'Sullivan
Whoops, simple fix for a build warning that happens if the build is not
333
    DRIZZLE_COMMAND_DONE(session->is_error());
1126.10.2 by Padraig O'Sullivan
Added hooks into the command start and query start dtrace probes.
334
  }
335
336
  return error;
1 by brian
clean slate
337
}
338
339
340
/**
327.2.4 by Brian Aker
Refactoring table.h
341
  Create a TableList object for an INFORMATION_SCHEMA table.
1 by brian
clean slate
342
343
    This function is used in the parser to convert a SHOW or DESCRIBE
344
    table_name command to a SELECT from INFORMATION_SCHEMA.
846 by Brian Aker
Removing on typedeffed class.
345
    It prepares a Select_Lex and a TableList object to represent the
1 by brian
clean slate
346
    given command as a SELECT parse tree.
347
1079.2.9 by Padraig O'Sullivan
Removed the dependency on knowing the position of an I_S table in the
348
  @param session           thread handle
349
  @param lex               current lex
350
  @param table_ident       table alias if it's used
351
  @param schema_table_name the name of the INFORMATION_SCHEMA table to be
352
                           created
1 by brian
clean slate
353
354
  @note
355
    Due to the way this function works with memory and LEX it cannot
356
    be used outside the parser (parse tree transformations outside
357
    the parser break PS and SP).
358
359
  @retval
360
    0                 success
361
  @retval
362
    1                 out of memory or SHOW commands are not allowed
363
                      in this version of the server.
364
*/
1273.13.38 by Brian Aker
Add in new show work.
365
static bool _schema_select(Session *session, Select_Lex *sel,
366
                           const string& schema_table_name)
367
{
368
  LEX_STRING db, table;
1858.1.2 by Padraig O'Sullivan
Converted another uint8_t type to be a bitset.
369
  bitset<NUM_OF_TABLE_OPTIONS> table_options;
1273.13.38 by Brian Aker
Add in new show work.
370
  /*
371
     We have to make non const db_name & table_name
372
     because of lower_case_table_names
373
  */
374
  session->make_lex_string(&db, "data_dictionary", sizeof("data_dictionary"), false);
375
  session->make_lex_string(&table, schema_table_name, false);
376
377
  if (! sel->add_table_to_list(session, new Table_ident(db, table),
1858.1.2 by Padraig O'Sullivan
Converted another uint8_t type to be a bitset.
378
                               NULL, table_options, TL_READ))
1273.13.38 by Brian Aker
Add in new show work.
379
  {
380
    return true;
381
  }
382
  return false;
383
}
384
385
int prepare_new_schema_table(Session *session, LEX *lex,
386
                             const string& schema_table_name)
387
{
388
  Select_Lex *schema_select_lex= NULL;
389
390
  Select_Lex *select_lex= lex->current_select;
391
  assert(select_lex);
392
  if (_schema_select(session, select_lex, schema_table_name))
393
  {
394
    return(1);
395
  }
396
  TableList *table_list= (TableList*) select_lex->table_list.first;
397
  assert(table_list);
398
  table_list->schema_select_lex= schema_select_lex;
399
400
  return 0;
401
}
1 by brian
clean slate
402
403
/**
520.1.22 by Brian Aker
Second pass of thd cleanup
404
  Execute command saved in session and lex->sql_command.
1 by brian
clean slate
405
406
    Before every operation that can request a write lock for a table
407
    wait if a global read lock exists. However do not wait if this
408
    thread has locked tables already. No new locks can be requested
409
    until the other locks are released. The thread that requests the
410
    global read lock waits for write locked tables to become unlocked.
411
412
    Note that wait_if_global_read_lock() sets a protection against a new
413
    global read lock when it succeeds. This needs to be released by
414
    start_waiting_global_read_lock() after the operation.
415
520.1.22 by Brian Aker
Second pass of thd cleanup
416
  @param session                       Thread handle
1 by brian
clean slate
417
418
  @todo
419
    - Invalidate the table in the query cache if something changed
420
    after unlocking when changes become visible.
421
    TODO: this is workaround. right way will be move invalidating in
422
    the unlock procedure.
423
    - TODO: use check_change_password()
424
    - JOIN is not supported yet. TODO
425
    - SUSPEND and FOR MIGRATE are not supported yet. TODO
426
427
  @retval
55 by brian
Update for using real bool types.
428
    false       OK
1 by brian
clean slate
429
  @retval
55 by brian
Update for using real bool types.
430
    true        Error
1 by brian
clean slate
431
*/
432
1921.4.13 by Brian Aker
Fix issue where session info might not be correct.
433
static int mysql_execute_command(Session *session)
1 by brian
clean slate
434
{
1100.3.68 by Padraig O'Sullivan
Changed the type of res in mysql_execute_command() to bool instead of int
435
  bool res= false;
520.1.22 by Brian Aker
Second pass of thd cleanup
436
  LEX  *lex= session->lex;
846 by Brian Aker
Removing on typedeffed class.
437
  /* first Select_Lex (have special meaning for many of non-SELECTcommands) */
438
  Select_Lex *select_lex= &lex->select_lex;
1 by brian
clean slate
439
  /* list of all tables in query */
327.2.4 by Brian Aker
Refactoring table.h
440
  TableList *all_tables;
1 by brian
clean slate
441
442
  /*
846 by Brian Aker
Removing on typedeffed class.
443
    In many cases first table of main Select_Lex have special meaning =>
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
444
    check that it is first table in global list and relink it first in
1 by brian
clean slate
445
    queries_tables list if it is necessary (we need such relinking only
446
    for queries with subqueries in select list, in this case tables of
447
    subqueries will go to global list first)
448
846 by Brian Aker
Removing on typedeffed class.
449
    all_tables will differ from first_table only if most upper Select_Lex
1 by brian
clean slate
450
    do not contain tables.
451
452
    Because of above in place where should be at least one table in most
846 by Brian Aker
Removing on typedeffed class.
453
    outer Select_Lex we have following check:
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
454
    assert(first_table == all_tables);
455
    assert(first_table == all_tables && first_table != 0);
1 by brian
clean slate
456
  */
457
  lex->first_lists_tables_same();
458
  /* should be assigned after making first tables same */
459
  all_tables= lex->query_tables;
460
  /* set context for commands which do not use setup_tables */
461
  select_lex->
327.2.4 by Brian Aker
Refactoring table.h
462
    context.resolve_in_table_list_only((TableList*)select_lex->
1 by brian
clean slate
463
                                       table_list.first);
464
465
  /*
466
    Reset warning count for each query that uses tables
467
    A better approach would be to reset this for any commands
468
    that is not a SHOW command or a select that only access local
469
    variables, but for now this is probably good enough.
470
    Don't reset warnings when executing a stored routine.
471
  */
1100.3.63 by Padraig O'Sullivan
Extracted the ALTER TABLE command into its own class and implementation
472
  if (all_tables || ! lex->is_single_level_stmt())
1100.3.66 by Padraig O'Sullivan
Extracted the last commands....Finally removed that gigantic switch
473
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
474
    drizzle_reset_errors(session, 0);
1100.3.66 by Padraig O'Sullivan
Extracted the last commands....Finally removed that gigantic switch
475
  }
1 by brian
clean slate
476
1273.1.13 by Jay Pipes
Style cleanup around TransactionContext::modified_non_trans_table and dead code removal
477
  assert(session->transaction.stmt.hasModifiedNonTransData() == false);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
478
1100.3.66 by Padraig O'Sullivan
Extracted the last commands....Finally removed that gigantic switch
479
  /* now we are ready to execute the statement */
480
  res= lex->statement->execute();
520.1.22 by Brian Aker
Second pass of thd cleanup
481
  session->set_proc_info("query end");
1 by brian
clean slate
482
  /*
483
    The return value for ROW_COUNT() is "implementation dependent" if the
484
    statement is not DELETE, INSERT or UPDATE, but -1 is what JDBC and ODBC
485
    wants. We also keep the last value in case of SQLCOM_CALL or
486
    SQLCOM_EXECUTE.
487
  */
1100.3.49 by Padraig O'Sullivan
Extracted the KILL command into its own class and implementation files.
488
  if (! (sql_command_flags[lex->sql_command].test(CF_BIT_HAS_ROW_COUNT)))
489
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
490
    session->row_count_func= -1;
1100.3.49 by Padraig O'Sullivan
Extracted the KILL command into its own class and implementation files.
491
  }
1 by brian
clean slate
492
1100.3.63 by Padraig O'Sullivan
Extracted the ALTER TABLE command into its own class and implementation
493
  return (res || session->is_error());
1 by brian
clean slate
494
}
520.1.22 by Brian Aker
Second pass of thd cleanup
495
bool execute_sqlcom_select(Session *session, TableList *all_tables)
1 by brian
clean slate
496
{
520.1.22 by Brian Aker
Second pass of thd cleanup
497
  LEX	*lex= session->lex;
1 by brian
clean slate
498
  select_result *result=lex->result;
873.1.9 by Jay Pipes
This patch fixes the following functions to properly error out
499
  bool res= false;
1 by brian
clean slate
500
  /* assign global limit variable if limit is not given */
501
  {
846 by Brian Aker
Removing on typedeffed class.
502
    Select_Lex *param= lex->unit.global_parameters;
1 by brian
clean slate
503
    if (!param->explicit_limit)
504
      param->select_limit=
520.1.22 by Brian Aker
Second pass of thd cleanup
505
        new Item_int((uint64_t) session->variables.select_limit);
1 by brian
clean slate
506
  }
1415 by Brian Aker
Mass overhaul to use schema_identifier.
507
  if (not (res= session->openTablesLock(all_tables)))
1 by brian
clean slate
508
  {
509
    if (lex->describe)
510
    {
511
      /*
512
        We always use select_send for EXPLAIN, even if it's an EXPLAIN
513
        for SELECT ... INTO OUTFILE: a user application should be able
514
        to prepend EXPLAIN to any query and receive output for it,
515
        even if the query itself redirects the output.
516
      */
517
      if (!(result= new select_send()))
971.6.11 by Eric Day
Removed purecov messages.
518
        return true;
520.1.22 by Brian Aker
Second pass of thd cleanup
519
      session->send_explain_fields(result);
1240.7.1 by Padraig O'Sullivan
Created an ExplainPlan class in the optimizer namespace. All printing of an explain in drizzle goes
520
      optimizer::ExplainPlan planner;
521
      res= planner.explainUnion(session, &session->lex->unit, result);
1 by brian
clean slate
522
      if (lex->describe & DESCRIBE_EXTENDED)
523
      {
524
        char buff[1024];
205 by Brian Aker
uint32 -> uin32_t
525
        String str(buff,(uint32_t) sizeof(buff), system_charset_info);
1 by brian
clean slate
526
        str.length(0);
520.1.22 by Brian Aker
Second pass of thd cleanup
527
        session->lex->unit.print(&str, QT_ORDINARY);
1 by brian
clean slate
528
        str.append('\0');
520.1.22 by Brian Aker
Second pass of thd cleanup
529
        push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
1 by brian
clean slate
530
                     ER_YES, str.ptr());
531
      }
532
      if (res)
533
        result->abort();
534
      else
535
        result->send_eof();
536
      delete result;
537
    }
538
    else
539
    {
540
      if (!result && !(result= new select_send()))
971.6.11 by Eric Day
Removed purecov messages.
541
        return true;
1643.6.1 by Djellel E. Difallah
Added hook points and the interface for the Query Cache plugin
542
543
      /* Init the Query Cache plugin */
1643.6.3 by Djellel E. Difallah
Refactoring of the QC Plugin's interface methods, adding mutual exclusion mechanism between sessions to cache a query, Store Meta inoformation of all the tables and select fields of the query
544
      plugin::QueryCache::prepareResultset(session); 
520.1.22 by Brian Aker
Second pass of thd cleanup
545
      res= handle_select(session, lex, result, 0);
1643.6.1 by Djellel E. Difallah
Added hook points and the interface for the Query Cache plugin
546
      /* Send the Resultset to the cache */
1643.6.3 by Djellel E. Difallah
Refactoring of the QC Plugin's interface methods, adding mutual exclusion mechanism between sessions to cache a query, Store Meta inoformation of all the tables and select fields of the query
547
      plugin::QueryCache::setResultset(session); 
1643.6.1 by Djellel E. Difallah
Added hook points and the interface for the Query Cache plugin
548
1 by brian
clean slate
549
      if (result != lex->result)
1643.6.3 by Djellel E. Difallah
Refactoring of the QC Plugin's interface methods, adding mutual exclusion mechanism between sessions to cache a query, Store Meta inoformation of all the tables and select fields of the query
550
        delete result;
1 by brian
clean slate
551
    }
552
  }
553
  return res;
554
}
555
556
557
#define MY_YACC_INIT 1000			// Start with big alloc
558
#define MY_YACC_MAX  32000			// Because of 'short'
559
560
bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
561
{
520.1.22 by Brian Aker
Second pass of thd cleanup
562
  LEX	*lex= current_session->lex;
1 by brian
clean slate
563
  ulong old_info=0;
438.1.13 by Brian Aker
uint cleanup.
564
  if ((uint32_t) *yystacksize >= MY_YACC_MAX)
1 by brian
clean slate
565
    return 1;
566
  if (!lex->yacc_yyvs)
567
    old_info= *yystacksize;
568
  *yystacksize= set_zone((*yystacksize)*2,MY_YACC_INIT,MY_YACC_MAX);
656.1.46 by Monty Taylor
More malloc return cleanups.
569
  unsigned char *tmpptr= NULL;
570
  if (!(tmpptr= (unsigned char *)realloc(lex->yacc_yyvs,
571
                                         *yystacksize* sizeof(**yyvs))))
572
      return 1;
573
  lex->yacc_yyvs= tmpptr;
574
  tmpptr= NULL;
575
  if (!(tmpptr= (unsigned char*)realloc(lex->yacc_yyss,
576
                                        *yystacksize* sizeof(**yyss))))
577
      return 1;
578
  lex->yacc_yyss= tmpptr;
1 by brian
clean slate
579
  if (old_info)
580
  {						// Copy old info from stack
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
581
    memcpy(lex->yacc_yyss, *yyss, old_info*sizeof(**yyss));
582
    memcpy(lex->yacc_yyvs, *yyvs, old_info*sizeof(**yyvs));
1 by brian
clean slate
583
  }
584
  *yyss=(short*) lex->yacc_yyss;
585
  *yyvs=(YYSTYPE*) lex->yacc_yyvs;
586
  return 0;
587
}
588
589
590
void
591
mysql_init_select(LEX *lex)
592
{
846 by Brian Aker
Removing on typedeffed class.
593
  Select_Lex *select_lex= lex->current_select;
1 by brian
clean slate
594
  select_lex->init_select();
595
  lex->wild= 0;
596
  if (select_lex == &lex->select_lex)
597
  {
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
598
    assert(lex->result == 0);
1 by brian
clean slate
599
    lex->exchange= 0;
600
  }
601
}
602
603
604
bool
605
mysql_new_select(LEX *lex, bool move_down)
606
{
846 by Brian Aker
Removing on typedeffed class.
607
  Select_Lex *select_lex;
520.1.22 by Brian Aker
Second pass of thd cleanup
608
  Session *session= lex->session;
1 by brian
clean slate
609
846 by Brian Aker
Removing on typedeffed class.
610
  if (!(select_lex= new (session->mem_root) Select_Lex()))
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
611
    return(1);
520.1.22 by Brian Aker
Second pass of thd cleanup
612
  select_lex->select_number= ++session->select_number;
1 by brian
clean slate
613
  select_lex->parent_lex= lex; /* Used in init_query. */
614
  select_lex->init_query();
615
  select_lex->init_select();
616
  lex->nest_level++;
617
  if (lex->nest_level > (int) MAX_SELECT_NESTING)
618
  {
619
    my_error(ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT,MYF(0),MAX_SELECT_NESTING);
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
620
    return(1);
1 by brian
clean slate
621
  }
622
  select_lex->nest_level= lex->nest_level;
623
  if (move_down)
624
  {
848 by Brian Aker
typdef class removal (just... use the name of the class).
625
    Select_Lex_Unit *unit;
1 by brian
clean slate
626
    /* first select_lex of subselect or derived table */
848 by Brian Aker
typdef class removal (just... use the name of the class).
627
    if (!(unit= new (session->mem_root) Select_Lex_Unit()))
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
628
      return(1);
1 by brian
clean slate
629
630
    unit->init_query();
631
    unit->init_select();
520.1.22 by Brian Aker
Second pass of thd cleanup
632
    unit->session= session;
1 by brian
clean slate
633
    unit->include_down(lex->current_select);
634
    unit->link_next= 0;
635
    unit->link_prev= 0;
636
    unit->return_to= lex->current_select;
637
    select_lex->include_down(unit);
638
    /*
639
      By default we assume that it is usual subselect and we have outer name
640
      resolution context, if no we will assign it to 0 later
641
    */
642
    select_lex->context.outer_context= &select_lex->outer_select()->context;
643
  }
644
  else
645
  {
646
    if (lex->current_select->order_list.first && !lex->current_select->braces)
647
    {
327.2.3 by Brian Aker
Refactoring of class Table
648
      my_error(ER_WRONG_USAGE, MYF(0), "UNION", "order_st BY");
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
649
      return(1);
1 by brian
clean slate
650
    }
651
    select_lex->include_neighbour(lex->current_select);
848 by Brian Aker
typdef class removal (just... use the name of the class).
652
    Select_Lex_Unit *unit= select_lex->master_unit();
520.1.22 by Brian Aker
Second pass of thd cleanup
653
    if (!unit->fake_select_lex && unit->add_fake_select_lex(lex->session))
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
654
      return(1);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
655
    select_lex->context.outer_context=
1 by brian
clean slate
656
                unit->first_select()->context.outer_context;
657
  }
658
659
  select_lex->master_unit()->global_parameters= select_lex;
847 by Brian Aker
More typdef class removal.
660
  select_lex->include_global((Select_Lex_Node**)&lex->all_selects_list);
1 by brian
clean slate
661
  lex->current_select= select_lex;
662
  /*
663
    in subquery is SELECT query and we allow resolution of names in SELECT
664
    list
665
  */
55 by brian
Update for using real bool types.
666
  select_lex->context.resolve_in_select_list= true;
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
667
  return(0);
1 by brian
clean slate
668
}
669
670
/**
671
  Create a select to return the same output as 'SELECT @@var_name'.
672
673
  Used for SHOW COUNT(*) [ WARNINGS | ERROR].
674
675
  This will crash with a core dump if the variable doesn't exists.
676
677
  @param var_name		Variable name
678
*/
679
680
void create_select_for_variable(const char *var_name)
681
{
520.1.22 by Brian Aker
Second pass of thd cleanup
682
  Session *session;
1 by brian
clean slate
683
  LEX *lex;
684
  LEX_STRING tmp, null_lex_string;
685
  Item *var;
673.2.1 by Toru Maesaka
First pass of replacing MySQL's strxmov with libc alternatives
686
  char buff[MAX_SYS_VAR_LENGTH*2+4+8];
687
  char *end= buff;
1 by brian
clean slate
688
520.1.22 by Brian Aker
Second pass of thd cleanup
689
  session= current_session;
690
  lex= session->lex;
1 by brian
clean slate
691
  mysql_init_select(lex);
692
  lex->sql_command= SQLCOM_SELECT;
693
  tmp.str= (char*) var_name;
694
  tmp.length=strlen(var_name);
212.6.6 by Mats Kindahl
Removing redundant use of casts in drizzled/ for memcmp(), memcpy(), memset(), and memmove().
695
  memset(&null_lex_string.str, 0, sizeof(null_lex_string));
1 by brian
clean slate
696
  /*
697
    We set the name of Item to @@session.var_name because that then is used
698
    as the column name in the output.
699
  */
520.1.22 by Brian Aker
Second pass of thd cleanup
700
  if ((var= get_system_var(session, OPT_SESSION, tmp, null_lex_string)))
1 by brian
clean slate
701
  {
1366.1.10 by Siddharth Prakash Singh
sprintf->snprintf in drizzled/sql_parse.cc
702
    end+= snprintf(buff, sizeof(buff), "@@session.%s", var_name);
1 by brian
clean slate
703
    var->set_name(buff, end-buff, system_charset_info);
838 by Brian Aker
More class adoption/method
704
    session->add_item_to_list(var);
1 by brian
clean slate
705
  }
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
706
  return;
1 by brian
clean slate
707
}
708
709
710
/**
711
  Parse a query.
712
520.1.22 by Brian Aker
Second pass of thd cleanup
713
  @param       session     Current thread
1 by brian
clean slate
714
  @param       inBuf   Begining of the query text
715
  @param       length  Length of the query text
716
*/
717
1280.3.17 by Padraig O'Sullivan
Merged from Monty
718
void mysql_parse(Session *session, const char *inBuf, uint32_t length)
1 by brian
clean slate
719
{
1878.10.1 by Billy Earney
removed my_micro_time, my_micro_time_and_time, along with my_getsystime and replaced with boost:date_time for compatibility between OS.
720
  boost::posix_time::ptime start_time=boost::posix_time::microsec_clock::local_time();
1897.1.7 by Brian Aker
Partial encapsulation of lex_start.
721
  session->lex->start(session);
1878.10.4 by billy.earney at gmail
resolved conflict in sql_parse.cc
722
735 by Brian Aker
Refactor session.
723
  session->reset_for_next_command();
1643.6.3 by Djellel E. Difallah
Refactoring of the QC Plugin's interface methods, adding mutual exclusion mechanism between sessions to cache a query, Store Meta inoformation of all the tables and select fields of the query
724
  /* Check if the Query is Cached if and return true if yes
725
   * TODO the plugin has to make sure that the query is cacheble
726
   * by setting the query_safe_cache param to TRUE
727
   */
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
728
  bool res= true;
729
  if (plugin::QueryCache::isCached(session))
1280.3.8 by Padraig O'Sullivan
Removed an obsolete comment related to the query cache that was confusing.
730
  {
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
731
    res= plugin::QueryCache::sendCachedResultset(session);
732
  }
733
  if (not res)
1643.6.13 by Djellel E. Difallah
adding tests
734
  {
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
735
    return;
1643.6.13 by Djellel E. Difallah
adding tests
736
  }
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
737
  LEX *lex= session->lex;
738
  Lex_input_stream lip(session, inBuf, length);
739
  bool err= parse_sql(session, &lip);
740
  if (!err)
741
  {
742
    {
1932.2.3 by Brian Aker
Updates for D-trace
743
      if (not session->is_error())
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
744
      {
1932.2.3 by Brian Aker
Updates for D-trace
745
        DRIZZLE_QUERY_EXEC_START(session->getQueryString()->c_str(),
1643.6.4 by Djellel E. Difallah
Added data dictionary view 'Query_cache_entries' to list current cached queries. Added a UDF print_query_cache_meta(key) to display a text representation of the metadata
746
                                 session->thread_id,
747
                                 const_cast<const char *>(session->db.empty() ? "" : session->db.c_str()));
748
        // Implement Views here --Brian
749
        /* Actually execute the query */
750
        try 
751
        {
752
          mysql_execute_command(session);
753
        }
754
        catch (...)
755
        {
756
          // Just try to catch any random failures that could have come
757
          // during execution.
758
        }
759
        DRIZZLE_QUERY_EXEC_DONE(0);
760
      }
761
    }
762
  }
763
  else
764
  {
765
    assert(session->is_error());
766
  }
767
  lex->unit.cleanup();
768
  session->set_proc_info("freeing items");
769
  session->end_statement();
770
  session->cleanup_after_query();
1878.10.1 by Billy Earney
removed my_micro_time, my_micro_time_and_time, along with my_getsystime and replaced with boost:date_time for compatibility between OS.
771
  boost::posix_time::ptime end_time=boost::posix_time::microsec_clock::local_time();
772
  session->status_var.execution_time_nsec+=(end_time-start_time).total_microseconds();
1 by brian
clean slate
773
}
774
775
776
777
/**
778
  Store field definition for create.
779
780
  @return
781
    Return 0 if ok
782
*/
783
520.1.22 by Brian Aker
Second pass of thd cleanup
784
bool add_field_to_list(Session *session, LEX_STRING *field_name, enum_field_types type,
1 by brian
clean slate
785
		       char *length, char *decimals,
438.1.13 by Brian Aker
uint cleanup.
786
		       uint32_t type_modifier,
1 by brian
clean slate
787
                       enum column_format_type column_format,
788
		       Item *default_value, Item *on_update_value,
789
                       LEX_STRING *comment,
790
		       char *change,
998.1.2 by Brian Aker
First pass on removing virt columns
791
                       List<String> *interval_list, const CHARSET_INFO * const cs)
1 by brian
clean slate
792
{
1052.2.3 by Nathan Williams
No actual code changes. Changed Create_field to CreateField to be consistent with coding standards.
793
  register CreateField *new_field;
520.1.22 by Brian Aker
Second pass of thd cleanup
794
  LEX  *lex= session->lex;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
795
  statement::AlterTable *statement= (statement::AlterTable *)lex->statement;
1 by brian
clean slate
796
797
  if (check_identifier_name(field_name, ER_TOO_LONG_IDENT))
1135 by Brian Aker
Merge of Lex -> Statement refactoring
798
    return true;
1 by brian
clean slate
799
800
  if (type_modifier & PRI_KEY_FLAG)
801
  {
802
    Key *key;
803
    lex->col_list.push_back(new Key_part_spec(*field_name, 0));
804
    key= new Key(Key::PRIMARY, null_lex_str,
805
                      &default_key_create_info,
806
                      0, lex->col_list);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
807
    statement->alter_info.key_list.push_back(key);
1 by brian
clean slate
808
    lex->col_list.empty();
809
  }
810
  if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG))
811
  {
812
    Key *key;
813
    lex->col_list.push_back(new Key_part_spec(*field_name, 0));
814
    key= new Key(Key::UNIQUE, null_lex_str,
815
                 &default_key_create_info, 0,
816
                 lex->col_list);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
817
    statement->alter_info.key_list.push_back(key);
1 by brian
clean slate
818
    lex->col_list.empty();
819
  }
820
821
  if (default_value)
822
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
823
    /*
1 by brian
clean slate
824
      Default value should be literal => basic constants =>
825
      no need fix_fields()
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
826
827
      We allow only one function as part of default value -
1 by brian
clean slate
828
      NOW() as default for TIMESTAMP type.
829
    */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
830
    if (default_value->type() == Item::FUNC_ITEM &&
1 by brian
clean slate
831
        !(((Item_func*)default_value)->functype() == Item_func::NOW_FUNC &&
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
832
         type == DRIZZLE_TYPE_TIMESTAMP))
1 by brian
clean slate
833
    {
834
      my_error(ER_INVALID_DEFAULT, MYF(0), field_name->str);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
835
      return true;
1 by brian
clean slate
836
    }
837
    else if (default_value->type() == Item::NULL_ITEM)
838
    {
839
      default_value= 0;
840
      if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) ==
841
	  NOT_NULL_FLAG)
842
      {
843
	my_error(ER_INVALID_DEFAULT, MYF(0), field_name->str);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
844
	return true;
1 by brian
clean slate
845
      }
846
    }
847
    else if (type_modifier & AUTO_INCREMENT_FLAG)
848
    {
849
      my_error(ER_INVALID_DEFAULT, MYF(0), field_name->str);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
850
      return true;
1 by brian
clean slate
851
    }
852
  }
853
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
854
  if (on_update_value && type != DRIZZLE_TYPE_TIMESTAMP)
1 by brian
clean slate
855
  {
856
    my_error(ER_INVALID_ON_UPDATE, MYF(0), field_name->str);
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
857
    return true;
1 by brian
clean slate
858
  }
859
1052.2.3 by Nathan Williams
No actual code changes. Changed Create_field to CreateField to be consistent with coding standards.
860
  if (!(new_field= new CreateField()) ||
520.1.22 by Brian Aker
Second pass of thd cleanup
861
      new_field->init(session, field_name->str, type, length, decimals, type_modifier,
1 by brian
clean slate
862
                      default_value, on_update_value, comment, change,
998.1.2 by Brian Aker
First pass on removing virt columns
863
                      interval_list, cs, 0, column_format))
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
864
    return true;
1 by brian
clean slate
865
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
866
  statement->alter_info.create_list.push_back(new_field);
1 by brian
clean slate
867
  lex->last_field=new_field;
1128.2.4 by Brian Aker
AlterInfo refactor back to class.
868
869
  return false;
1 by brian
clean slate
870
}
871
872
873
/** Store position for column in ALTER TABLE .. ADD column. */
874
875
void store_position_for_column(const char *name)
876
{
520.1.22 by Brian Aker
Second pass of thd cleanup
877
  current_session->lex->last_field->after=const_cast<char*> (name);
1 by brian
clean slate
878
}
879
880
/**
881
  Add a table to list of used tables.
882
883
  @param table		Table to add
884
  @param alias		alias for table (or null if no alias)
885
  @param table_options	A set of the following bits:
886
                         - TL_OPTION_UPDATING : Table will be updated
887
                         - TL_OPTION_FORCE_INDEX : Force usage of index
888
                         - TL_OPTION_ALIAS : an alias in multi table DELETE
889
  @param lock_type	How table should be locked
890
  @param use_index	List of indexed used in USE INDEX
891
  @param ignore_index	List of indexed used in IGNORE INDEX
892
893
  @retval
894
      0		Error
895
  @retval
327.2.4 by Brian Aker
Refactoring table.h
896
    \#	Pointer to TableList element added to the total table list
1 by brian
clean slate
897
*/
898
846 by Brian Aker
Removing on typedeffed class.
899
TableList *Select_Lex::add_table_to_list(Session *session,
1858.1.2 by Padraig O'Sullivan
Converted another uint8_t type to be a bitset.
900
					                     Table_ident *table,
901
					                     LEX_STRING *alias,
902
					                     const bitset<NUM_OF_TABLE_OPTIONS>& table_options,
903
					                     thr_lock_type lock_type,
904
					                     List<Index_hint> *index_hints_arg,
905
                                         LEX_STRING *option)
1 by brian
clean slate
906
{
1874.1.1 by Brian Aker
Encapsulate schema_name it table_list.
907
  TableList *ptr;
327.2.4 by Brian Aker
Refactoring table.h
908
  TableList *previous_table_ref; /* The table preceding the current one. */
1 by brian
clean slate
909
  char *alias_str;
520.1.22 by Brian Aker
Second pass of thd cleanup
910
  LEX *lex= session->lex;
1 by brian
clean slate
911
912
  if (!table)
1054.1.5 by Brian Aker
Formatting/remove dead variables.
913
    return NULL;				// End of memory
1 by brian
clean slate
914
  alias_str= alias ? alias->str : table->table.str;
1858.1.2 by Padraig O'Sullivan
Converted another uint8_t type to be a bitset.
915
  if (! table_options.test(TL_OPTION_ALIAS) &&
1 by brian
clean slate
916
      check_table_name(table->table.str, table->table.length))
917
  {
918
    my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str);
1054.1.5 by Brian Aker
Formatting/remove dead variables.
919
    return NULL;
1 by brian
clean slate
920
  }
921
1415 by Brian Aker
Mass overhaul to use schema_identifier.
922
  if (table->is_derived_table() == false && table->db.str)
1 by brian
clean slate
923
  {
1415 by Brian Aker
Mass overhaul to use schema_identifier.
924
    my_casedn_str(files_charset_info, table->db.str);
925
1471.2.1 by Monty Taylor
There's a bug here. Passing in the length causes std::string to believe the
926
    SchemaIdentifier schema_identifier(string(table->db.str));
1578.4.11 by Brian Aker
PAss through the code removing current_session
927
    if (not check_db_name(session, schema_identifier))
1415 by Brian Aker
Mass overhaul to use schema_identifier.
928
    {
929
930
      my_error(ER_WRONG_DB_NAME, MYF(0), table->db.str);
931
      return NULL;
932
    }
1 by brian
clean slate
933
  }
934
935
  if (!alias)					/* Alias is case sensitive */
936
  {
937
    if (table->sel)
938
    {
939
      my_message(ER_DERIVED_MUST_HAVE_ALIAS,
940
                 ER(ER_DERIVED_MUST_HAVE_ALIAS), MYF(0));
1054.1.5 by Brian Aker
Formatting/remove dead variables.
941
      return NULL;
1 by brian
clean slate
942
    }
520.1.22 by Brian Aker
Second pass of thd cleanup
943
    if (!(alias_str= (char*) session->memdup(alias_str,table->table.length+1)))
1054.1.5 by Brian Aker
Formatting/remove dead variables.
944
      return NULL;
1 by brian
clean slate
945
  }
520.1.22 by Brian Aker
Second pass of thd cleanup
946
  if (!(ptr = (TableList *) session->calloc(sizeof(TableList))))
971.6.11 by Eric Day
Removed purecov messages.
947
    return NULL;
1672.3.5 by Brian Aker
This replaces the allocation we do for insert/update.
948
1 by brian
clean slate
949
  if (table->db.str)
950
  {
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
951
    ptr->setIsFqtn(true);
1874.1.1 by Brian Aker
Encapsulate schema_name it table_list.
952
    ptr->setSchemaName(table->db.str);
1 by brian
clean slate
953
    ptr->db_length= table->db.length;
954
  }
1874.1.1 by Brian Aker
Encapsulate schema_name it table_list.
955
  else if (lex->copy_db_to(ptr->getSchemaNamePtr(), &ptr->db_length))
1054.1.5 by Brian Aker
Formatting/remove dead variables.
956
    return NULL;
1 by brian
clean slate
957
  else
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
958
    ptr->setIsFqtn(false);
1 by brian
clean slate
959
960
  ptr->alias= alias_str;
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
961
  ptr->setIsAlias(alias ? true : false);
1874.1.2 by Brian Aker
Encapsulate table_name from table_list.
962
  ptr->setTableName(table->table.str);
1 by brian
clean slate
963
  ptr->table_name_length=table->table.length;
964
  ptr->lock_type=   lock_type;
1858.1.2 by Padraig O'Sullivan
Converted another uint8_t type to be a bitset.
965
  ptr->force_index= table_options.test(TL_OPTION_FORCE_INDEX);
966
  ptr->ignore_leaves= table_options.test(TL_OPTION_IGNORE_LEAVES);
1 by brian
clean slate
967
  ptr->derived=	    table->sel;
968
  ptr->select_lex=  lex->current_select;
969
  ptr->index_hints= index_hints_arg;
970
  ptr->option= option ? option->str : 0;
971
  /* check that used name is unique */
972
  if (lock_type != TL_IGNORE)
973
  {
327.2.4 by Brian Aker
Refactoring table.h
974
    TableList *first_table= (TableList*) table_list.first;
975
    for (TableList *tables= first_table ;
1 by brian
clean slate
976
	 tables ;
977
	 tables=tables->next_local)
978
    {
979
      if (!my_strcasecmp(table_alias_charset, alias_str, tables->alias) &&
1874.1.1 by Brian Aker
Encapsulate schema_name it table_list.
980
	  !strcasecmp(ptr->getSchemaName(), tables->getSchemaName()))
1 by brian
clean slate
981
      {
971.6.11 by Eric Day
Removed purecov messages.
982
	my_error(ER_NONUNIQ_TABLE, MYF(0), alias_str);
983
	return NULL;
1 by brian
clean slate
984
      }
985
    }
986
  }
987
  /* Store the table reference preceding the current one. */
988
  if (table_list.elements > 0)
989
  {
990
    /*
327.2.4 by Brian Aker
Refactoring table.h
991
      table_list.next points to the last inserted TableList->next_local'
1 by brian
clean slate
992
      element
993
      We don't use the offsetof() macro here to avoid warnings from gcc
994
    */
327.2.4 by Brian Aker
Refactoring table.h
995
    previous_table_ref= (TableList*) ((char*) table_list.next -
1 by brian
clean slate
996
                                       ((char*) &(ptr->next_local) -
997
                                        (char*) ptr));
998
    /*
999
      Set next_name_resolution_table of the previous table reference to point
1000
      to the current table reference. In effect the list
327.2.4 by Brian Aker
Refactoring table.h
1001
      TableList::next_name_resolution_table coincides with
1002
      TableList::next_local. Later this may be changed in
1 by brian
clean slate
1003
      store_top_level_join_columns() for NATURAL/USING joins.
1004
    */
1005
    previous_table_ref->next_name_resolution_table= ptr;
1006
  }
1007
1008
  /*
1009
    Link the current table reference in a local list (list for current select).
1010
    Notice that as a side effect here we set the next_local field of the
1011
    previous table reference to 'ptr'. Here we also add one element to the
1012
    list 'table_list'.
1013
  */
481 by Brian Aker
Remove all of uchar.
1014
  table_list.link_in_list((unsigned char*) ptr, (unsigned char**) &ptr->next_local);
1 by brian
clean slate
1015
  ptr->next_name_resolution_table= NULL;
1016
  /* Link table in global list (all used tables) */
1017
  lex->add_to_query_tables(ptr);
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1018
  return ptr;
1 by brian
clean slate
1019
}
1020
1021
1022
/**
1023
  Initialize a new table list for a nested join.
1024
327.2.4 by Brian Aker
Refactoring table.h
1025
    The function initializes a structure of the TableList type
1 by brian
clean slate
1026
    for a nested join. It sets up its nested join list as empty.
1027
    The created structure is added to the front of the current
846 by Brian Aker
Removing on typedeffed class.
1028
    join list in the Select_Lex object. Then the function
1 by brian
clean slate
1029
    changes the current nest level for joins to refer to the newly
1030
    created empty list after having saved the info on the old level
1031
    in the initialized structure.
1032
520.1.22 by Brian Aker
Second pass of thd cleanup
1033
  @param session         current thread
1 by brian
clean slate
1034
1035
  @retval
1036
    0   if success
1037
  @retval
1038
    1   otherwise
1039
*/
1040
846 by Brian Aker
Removing on typedeffed class.
1041
bool Select_Lex::init_nested_join(Session *session)
1 by brian
clean slate
1042
{
327.2.4 by Brian Aker
Refactoring table.h
1043
  TableList *ptr;
1044
  nested_join_st *nested_join;
1 by brian
clean slate
1045
520.1.22 by Brian Aker
Second pass of thd cleanup
1046
  if (!(ptr= (TableList*) session->calloc(ALIGN_SIZE(sizeof(TableList))+
327.2.4 by Brian Aker
Refactoring table.h
1047
                                       sizeof(nested_join_st))))
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1048
    return true;
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1049
  ptr->setNestedJoin(((nested_join_st*) ((unsigned char*) ptr + ALIGN_SIZE(sizeof(TableList)))));
1050
  nested_join= ptr->getNestedJoin();
1 by brian
clean slate
1051
  join_list->push_front(ptr);
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1052
  ptr->setEmbedding(embedding);
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1053
  ptr->setJoinList(join_list);
1 by brian
clean slate
1054
  ptr->alias= (char*) "(nested_join)";
1055
  embedding= ptr;
1056
  join_list= &nested_join->join_list;
1057
  join_list->empty();
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1058
  return false;
1 by brian
clean slate
1059
}
1060
1061
1062
/**
1063
  End a nested join table list.
1064
1065
    The function returns to the previous join nest level.
1066
    If the current level contains only one member, the function
1067
    moves it one level up, eliminating the nest.
1068
520.1.22 by Brian Aker
Second pass of thd cleanup
1069
  @param session         current thread
1 by brian
clean slate
1070
1071
  @return
327.2.4 by Brian Aker
Refactoring table.h
1072
    - Pointer to TableList element added to the total table list, if success
1 by brian
clean slate
1073
    - 0, otherwise
1074
*/
1075
846 by Brian Aker
Removing on typedeffed class.
1076
TableList *Select_Lex::end_nested_join(Session *)
1 by brian
clean slate
1077
{
327.2.4 by Brian Aker
Refactoring table.h
1078
  TableList *ptr;
1079
  nested_join_st *nested_join;
1 by brian
clean slate
1080
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1081
  assert(embedding);
1 by brian
clean slate
1082
  ptr= embedding;
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1083
  join_list= ptr->getJoinList();
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1084
  embedding= ptr->getEmbedding();
1085
  nested_join= ptr->getNestedJoin();
1 by brian
clean slate
1086
  if (nested_join->join_list.elements == 1)
1087
  {
327.2.4 by Brian Aker
Refactoring table.h
1088
    TableList *embedded= nested_join->join_list.head();
1 by brian
clean slate
1089
    join_list->pop();
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1090
    embedded->setJoinList(join_list);
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1091
    embedded->setEmbedding(embedding);
1 by brian
clean slate
1092
    join_list->push_front(embedded);
1093
    ptr= embedded;
1094
  }
1095
  else if (nested_join->join_list.elements == 0)
1096
  {
1097
    join_list->pop();
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1098
    ptr= NULL;                                     // return value
1 by brian
clean slate
1099
  }
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1100
  return ptr;
1 by brian
clean slate
1101
}
1102
1103
1104
/**
1105
  Nest last join operation.
1106
1107
    The function nest last join operation as if it was enclosed in braces.
1108
520.1.22 by Brian Aker
Second pass of thd cleanup
1109
  @param session         current thread
1 by brian
clean slate
1110
1111
  @retval
1112
    0  Error
1113
  @retval
327.2.4 by Brian Aker
Refactoring table.h
1114
    \#  Pointer to TableList element created for the new nested join
1 by brian
clean slate
1115
*/
1116
846 by Brian Aker
Removing on typedeffed class.
1117
TableList *Select_Lex::nest_last_join(Session *session)
1 by brian
clean slate
1118
{
327.2.4 by Brian Aker
Refactoring table.h
1119
  TableList *ptr;
1120
  nested_join_st *nested_join;
1121
  List<TableList> *embedded_list;
1 by brian
clean slate
1122
520.1.22 by Brian Aker
Second pass of thd cleanup
1123
  if (!(ptr= (TableList*) session->calloc(ALIGN_SIZE(sizeof(TableList))+
1672.3.5 by Brian Aker
This replaces the allocation we do for insert/update.
1124
                                          sizeof(nested_join_st))))
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1125
    return NULL;
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1126
  ptr->setNestedJoin(((nested_join_st*) ((unsigned char*) ptr + ALIGN_SIZE(sizeof(TableList)))));
1127
  nested_join= ptr->getNestedJoin();
1128
  ptr->setEmbedding(embedding);
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1129
  ptr->setJoinList(join_list);
1 by brian
clean slate
1130
  ptr->alias= (char*) "(nest_last_join)";
1131
  embedded_list= &nested_join->join_list;
1132
  embedded_list->empty();
1133
438.1.13 by Brian Aker
uint cleanup.
1134
  for (uint32_t i=0; i < 2; i++)
1 by brian
clean slate
1135
  {
327.2.4 by Brian Aker
Refactoring table.h
1136
    TableList *table= join_list->pop();
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1137
    table->setJoinList(embedded_list);
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1138
    table->setEmbedding(ptr);
1 by brian
clean slate
1139
    embedded_list->push_back(table);
1140
    if (table->natural_join)
1141
    {
55 by brian
Update for using real bool types.
1142
      ptr->is_natural_join= true;
1 by brian
clean slate
1143
      /*
1144
        If this is a JOIN ... USING, move the list of joined fields to the
1145
        table reference that describes the join.
1146
      */
1147
      if (prev_join_using)
1148
        ptr->join_using_fields= prev_join_using;
1149
    }
1150
  }
1151
  join_list->push_front(ptr);
1152
  nested_join->used_tables= nested_join->not_null_tables= (table_map) 0;
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1153
  return ptr;
1 by brian
clean slate
1154
}
1155
1156
1157
/**
1158
  Add a table to the current join list.
1159
1160
    The function puts a table in front of the current join list
846 by Brian Aker
Removing on typedeffed class.
1161
    of Select_Lex object.
1 by brian
clean slate
1162
    Thus, joined tables are put into this list in the reverse order
1163
    (the most outer join operation follows first).
1164
1165
  @param table       the table to add
1166
1167
  @return
1168
    None
1169
*/
1170
846 by Brian Aker
Removing on typedeffed class.
1171
void Select_Lex::add_joined_table(TableList *table)
1 by brian
clean slate
1172
{
1173
  join_list->push_front(table);
1637.2.6 by Vijay Samuel
Merge encapsulate TableList-1.
1174
  table->setJoinList(join_list);
1637.2.7 by Vijay Samuel
Merge encapsulate TableList-2.
1175
  table->setEmbedding(embedding);
1 by brian
clean slate
1176
}
1177
1178
1179
/**
1180
  Convert a right join into equivalent left join.
1181
1182
    The function takes the current join list t[0],t[1] ... and
1183
    effectively converts it into the list t[1],t[0] ...
1184
    Although the outer_join flag for the new nested table contains
1185
    JOIN_TYPE_RIGHT, it will be handled as the inner table of a left join
1186
    operation.
1187
1188
  EXAMPLES
1189
  @verbatim
1190
    SELECT * FROM t1 RIGHT JOIN t2 ON on_expr =>
1191
      SELECT * FROM t2 LEFT JOIN t1 ON on_expr
1192
1193
    SELECT * FROM t1,t2 RIGHT JOIN t3 ON on_expr =>
1194
      SELECT * FROM t1,t3 LEFT JOIN t2 ON on_expr
1195
1196
    SELECT * FROM t1,t2 RIGHT JOIN (t3,t4) ON on_expr =>
1197
      SELECT * FROM t1,(t3,t4) LEFT JOIN t2 ON on_expr
1198
1199
    SELECT * FROM t1 LEFT JOIN t2 ON on_expr1 RIGHT JOIN t3  ON on_expr2 =>
1200
      SELECT * FROM t3 LEFT JOIN (t1 LEFT JOIN t2 ON on_expr2) ON on_expr1
1201
   @endverbatim
1202
520.1.22 by Brian Aker
Second pass of thd cleanup
1203
  @param session         current thread
1 by brian
clean slate
1204
1205
  @return
1206
    - Pointer to the table representing the inner table, if success
1207
    - 0, otherwise
1208
*/
1209
846 by Brian Aker
Removing on typedeffed class.
1210
TableList *Select_Lex::convert_right_join()
1 by brian
clean slate
1211
{
327.2.4 by Brian Aker
Refactoring table.h
1212
  TableList *tab2= join_list->pop();
1213
  TableList *tab1= join_list->pop();
1 by brian
clean slate
1214
1215
  join_list->push_front(tab2);
1216
  join_list->push_front(tab1);
1217
  tab1->outer_join|= JOIN_TYPE_RIGHT;
1218
1054.1.5 by Brian Aker
Formatting/remove dead variables.
1219
  return tab1;
1 by brian
clean slate
1220
}
1221
1222
/**
1223
  Set lock for all tables in current select level.
1224
1225
  @param lock_type			Lock to set for tables
1226
1227
  @note
1228
    If lock is a write lock, then tables->updating is set 1
1229
    This is to get tables_ok to know that the table is updated by the
1230
    query
1231
*/
1232
846 by Brian Aker
Removing on typedeffed class.
1233
void Select_Lex::set_lock_for_tables(thr_lock_type lock_type)
1 by brian
clean slate
1234
{
327.2.4 by Brian Aker
Refactoring table.h
1235
  for (TableList *tables= (TableList*) table_list.first;
1 by brian
clean slate
1236
       tables;
1237
       tables= tables->next_local)
1238
  {
1239
    tables->lock_type= lock_type;
1240
  }
1241
}
1242
1243
1244
/**
846 by Brian Aker
Removing on typedeffed class.
1245
  Create a fake Select_Lex for a unit.
1 by brian
clean slate
1246
846 by Brian Aker
Removing on typedeffed class.
1247
    The method create a fake Select_Lex object for a unit.
1 by brian
clean slate
1248
    This object is created for any union construct containing a union
1249
    operation and also for any single select union construct of the form
1250
    @verbatim
1273.2.9 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_parse.cc
1251
    (SELECT ... ORDER BY order_list [LIMIT n]) ORDER BY ...
1 by brian
clean slate
1252
    @endvarbatim
1253
    or of the form
1254
    @varbatim
1273.2.9 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_parse.cc
1255
    (SELECT ... ORDER BY LIMIT n) ORDER BY ...
1 by brian
clean slate
1256
    @endvarbatim
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1257
520.1.22 by Brian Aker
Second pass of thd cleanup
1258
  @param session_arg		   thread handle
1 by brian
clean slate
1259
1260
  @note
1261
    The object is used to retrieve rows from the temporary table
1262
    where the result on the union is obtained.
1263
1264
  @retval
1265
    1     on failure to create the object
1266
  @retval
1267
    0     on success
1268
*/
1269
848 by Brian Aker
typdef class removal (just... use the name of the class).
1270
bool Select_Lex_Unit::add_fake_select_lex(Session *session_arg)
1 by brian
clean slate
1271
{
846 by Brian Aker
Removing on typedeffed class.
1272
  Select_Lex *first_sl= first_select();
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1273
  assert(!fake_select_lex);
1 by brian
clean slate
1274
846 by Brian Aker
Removing on typedeffed class.
1275
  if (!(fake_select_lex= new (session_arg->mem_root) Select_Lex()))
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1276
      return(1);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1277
  fake_select_lex->include_standalone(this,
847 by Brian Aker
More typdef class removal.
1278
                                      (Select_Lex_Node**)&fake_select_lex);
1 by brian
clean slate
1279
  fake_select_lex->select_number= INT_MAX;
520.1.22 by Brian Aker
Second pass of thd cleanup
1280
  fake_select_lex->parent_lex= session_arg->lex; /* Used in init_query. */
1 by brian
clean slate
1281
  fake_select_lex->make_empty_select();
1282
  fake_select_lex->linkage= GLOBAL_OPTIONS_TYPE;
1283
  fake_select_lex->select_limit= 0;
1284
1285
  fake_select_lex->context.outer_context=first_sl->context.outer_context;
1273.2.9 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_parse.cc
1286
  /* allow item list resolving in fake select for ORDER BY */
55 by brian
Update for using real bool types.
1287
  fake_select_lex->context.resolve_in_select_list= true;
1 by brian
clean slate
1288
  fake_select_lex->context.select_lex= fake_select_lex;
1289
1290
  if (!is_union())
1291
  {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1292
    /*
1293
      This works only for
1273.2.9 by Stewart Smith
fix accidental mangling of comment: s/order_st BY/ORDER BY/. in sql_parse.cc
1294
      (SELECT ... ORDER BY list [LIMIT n]) ORDER BY order_list [LIMIT m],
1295
      (SELECT ... LIMIT n) ORDER BY order_list [LIMIT m]
1 by brian
clean slate
1296
      just before the parser starts processing order_list
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1297
    */
1 by brian
clean slate
1298
    global_parameters= fake_select_lex;
1299
    fake_select_lex->no_table_names_allowed= 1;
520.1.22 by Brian Aker
Second pass of thd cleanup
1300
    session_arg->lex->current_select= fake_select_lex;
1 by brian
clean slate
1301
  }
520.1.22 by Brian Aker
Second pass of thd cleanup
1302
  session_arg->lex->pop_context();
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1303
  return(0);
1 by brian
clean slate
1304
}
1305
1306
1307
/**
1308
  Push a new name resolution context for a JOIN ... ON clause to the
1309
  context stack of a query block.
1310
1311
    Create a new name resolution context for a JOIN ... ON clause,
1312
    set the first and last leaves of the list of table references
1313
    to be used for name resolution, and push the newly created
1314
    context to the stack of contexts of the query.
1315
520.1.22 by Brian Aker
Second pass of thd cleanup
1316
  @param session       pointer to current thread
1 by brian
clean slate
1317
  @param left_op   left  operand of the JOIN
1318
  @param right_op  rigth operand of the JOIN
1319
1320
  @retval
55 by brian
Update for using real bool types.
1321
    false  if all is OK
1 by brian
clean slate
1322
  @retval
55 by brian
Update for using real bool types.
1323
    true   if a memory allocation error occured
1 by brian
clean slate
1324
*/
1325
1326
bool
520.1.22 by Brian Aker
Second pass of thd cleanup
1327
push_new_name_resolution_context(Session *session,
327.2.4 by Brian Aker
Refactoring table.h
1328
                                 TableList *left_op, TableList *right_op)
1 by brian
clean slate
1329
{
1330
  Name_resolution_context *on_context;
520.1.22 by Brian Aker
Second pass of thd cleanup
1331
  if (!(on_context= new (session->mem_root) Name_resolution_context))
55 by brian
Update for using real bool types.
1332
    return true;
1 by brian
clean slate
1333
  on_context->init();
1334
  on_context->first_name_resolution_table=
1335
    left_op->first_leaf_for_name_resolution();
1336
  on_context->last_name_resolution_table=
1337
    right_op->last_leaf_for_name_resolution();
520.1.22 by Brian Aker
Second pass of thd cleanup
1338
  return session->lex->push_context(on_context);
1 by brian
clean slate
1339
}
1340
1341
1342
/**
1343
  Add an ON condition to the second operand of a JOIN ... ON.
1344
1345
    Add an ON condition to the right operand of a JOIN ... ON clause.
1346
1347
  @param b     the second operand of a JOIN ... ON
1348
  @param expr  the condition to be added to the ON clause
1349
1350
  @retval
55 by brian
Update for using real bool types.
1351
    false  if there was some error
1 by brian
clean slate
1352
  @retval
55 by brian
Update for using real bool types.
1353
    true   if all is OK
1 by brian
clean slate
1354
*/
1355
327.2.4 by Brian Aker
Refactoring table.h
1356
void add_join_on(TableList *b, Item *expr)
1 by brian
clean slate
1357
{
1358
  if (expr)
1359
  {
1360
    if (!b->on_expr)
1361
      b->on_expr= expr;
1362
    else
1363
    {
1364
      /*
1365
        If called from the parser, this happens if you have both a
1366
        right and left join. If called later, it happens if we add more
1367
        than one condition to the ON clause.
1368
      */
1369
      b->on_expr= new Item_cond_and(b->on_expr,expr);
1370
    }
1371
    b->on_expr->top_level_item();
1372
  }
1373
}
1374
1375
1376
/**
1377
  Mark that there is a NATURAL JOIN or JOIN ... USING between two
1378
  tables.
1379
1380
    This function marks that table b should be joined with a either via
1381
    a NATURAL JOIN or via JOIN ... USING. Both join types are special
1382
    cases of each other, so we treat them together. The function
1383
    setup_conds() creates a list of equal condition between all fields
1384
    of the same name for NATURAL JOIN or the fields in 'using_fields'
1385
    for JOIN ... USING. The list of equality conditions is stored
1386
    either in b->on_expr, or in JOIN::conds, depending on whether there
1387
    was an outer join.
1388
1389
  EXAMPLE
1390
  @verbatim
1391
    SELECT * FROM t1 NATURAL LEFT JOIN t2
1392
     <=>
1393
    SELECT * FROM t1 LEFT JOIN t2 ON (t1.i=t2.i and t1.j=t2.j ... )
1394
1395
    SELECT * FROM t1 NATURAL JOIN t2 WHERE <some_cond>
1396
     <=>
1397
    SELECT * FROM t1, t2 WHERE (t1.i=t2.i and t1.j=t2.j and <some_cond>)
1398
1399
    SELECT * FROM t1 JOIN t2 USING(j) WHERE <some_cond>
1400
     <=>
1401
    SELECT * FROM t1, t2 WHERE (t1.j=t2.j and <some_cond>)
1402
   @endverbatim
1403
1404
  @param a		  Left join argument
1405
  @param b		  Right join argument
1406
  @param using_fields    Field names from USING clause
1407
*/
1408
327.2.4 by Brian Aker
Refactoring table.h
1409
void add_join_natural(TableList *a, TableList *b, List<String> *using_fields,
846 by Brian Aker
Removing on typedeffed class.
1410
                      Select_Lex *lex)
1 by brian
clean slate
1411
{
1412
  b->natural_join= a;
1413
  lex->prev_join_using= using_fields;
1414
}
1415
1416
1417
/**
1418
  Check if the select is a simple select (not an union).
1419
1420
  @retval
1421
    0	ok
1422
  @retval
1423
    1	error	; In this case the error messege is sent to the client
1424
*/
1425
1426
bool check_simple_select()
1427
{
520.1.22 by Brian Aker
Second pass of thd cleanup
1428
  Session *session= current_session;
1429
  LEX *lex= session->lex;
1 by brian
clean slate
1430
  if (lex->current_select != &lex->select_lex)
1431
  {
1432
    char command[80];
520.1.22 by Brian Aker
Second pass of thd cleanup
1433
    Lex_input_stream *lip= session->m_lip;
629.5.2 by Toru Maesaka
Second pass of replacing MySQL's strmake() with libc calls
1434
    strncpy(command, lip->yylval->symbol.str,
1067.4.4 by Nathan Williams
The rest of the files in the drizzled directory were purged of the cmin macro and replace with std::min (except for the definition in globals.h and 1 usage in stacktrace.cc).
1435
            min(lip->yylval->symbol.length, (uint32_t)(sizeof(command)-1)));
1436
    command[min(lip->yylval->symbol.length, (uint32_t)(sizeof(command)-1))]=0;
1 by brian
clean slate
1437
    my_error(ER_CANT_USE_OPTION_HERE, MYF(0), command);
1438
    return 1;
1439
  }
1440
  return 0;
1441
}
1442
1443
1444
/**
1445
  Construct ALL/ANY/SOME subquery Item.
1446
1447
  @param left_expr   pointer to left expression
1448
  @param cmp         compare function creator
1449
  @param all         true if we create ALL subquery
1450
  @param select_lex  pointer on parsed subquery structure
1451
1452
  @return
1453
    constructed Item (or 0 if out of memory)
1454
*/
1455
Item * all_any_subquery_creator(Item *left_expr,
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
1456
                                chooser_compare_func_creator cmp,
1457
                                bool all,
846 by Brian Aker
Removing on typedeffed class.
1458
                                Select_Lex *select_lex)
1 by brian
clean slate
1459
{
1460
  if ((cmp == &comp_eq_creator) && !all)       //  = ANY <=> IN
1461
    return new Item_in_subselect(left_expr, select_lex);
1462
1463
  if ((cmp == &comp_ne_creator) && all)        // <> ALL <=> NOT IN
1464
    return new Item_func_not(new Item_in_subselect(left_expr, select_lex));
1465
1466
  Item_allany_subselect *it=
1467
    new Item_allany_subselect(left_expr, cmp, select_lex, all);
1468
  if (all)
1469
    return it->upper_item= new Item_func_not_all(it);	/* ALL */
1470
1471
  return it->upper_item= new Item_func_nop_all(it);      /* ANY/SOME */
1472
}
1473
1474
1475
/**
826 by Brian Aker
Simplify update
1476
  Update query pre-check.
1 by brian
clean slate
1477
520.1.22 by Brian Aker
Second pass of thd cleanup
1478
  @param session		Thread handler
1 by brian
clean slate
1479
  @param tables	Global/local table list (have to be the same)
1480
1481
  @retval
55 by brian
Update for using real bool types.
1482
    false OK
1 by brian
clean slate
1483
  @retval
55 by brian
Update for using real bool types.
1484
    true  Error
1 by brian
clean slate
1485
*/
1486
826 by Brian Aker
Simplify update
1487
bool update_precheck(Session *session, TableList *)
1 by brian
clean slate
1488
{
1489
  const char *msg= 0;
520.1.22 by Brian Aker
Second pass of thd cleanup
1490
  LEX *lex= session->lex;
846 by Brian Aker
Removing on typedeffed class.
1491
  Select_Lex *select_lex= &lex->select_lex;
1 by brian
clean slate
1492
826 by Brian Aker
Simplify update
1493
  if (session->lex->select_lex.item_list.elements != session->lex->value_list.elements)
1 by brian
clean slate
1494
  {
1495
    my_message(ER_WRONG_VALUE_COUNT, ER(ER_WRONG_VALUE_COUNT), MYF(0));
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1496
    return(true);
1 by brian
clean slate
1497
  }
1498
826 by Brian Aker
Simplify update
1499
  if (session->lex->select_lex.table_list.elements > 1)
1 by brian
clean slate
1500
  {
826 by Brian Aker
Simplify update
1501
    if (select_lex->order_list.elements)
1502
      msg= "ORDER BY";
1503
    else if (select_lex->select_limit)
1504
      msg= "LIMIT";
1505
    if (msg)
1506
    {
1507
      my_error(ER_WRONG_USAGE, MYF(0), "UPDATE", msg);
1508
      return(true);
1509
    }
1 by brian
clean slate
1510
  }
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1511
  return(false);
1 by brian
clean slate
1512
}
1513
1514
1515
/**
1516
  simple INSERT query pre-check.
1517
520.1.22 by Brian Aker
Second pass of thd cleanup
1518
  @param session		Thread handler
1 by brian
clean slate
1519
  @param tables	Global table list
1520
1521
  @retval
55 by brian
Update for using real bool types.
1522
    false  OK
1 by brian
clean slate
1523
  @retval
55 by brian
Update for using real bool types.
1524
    true   error
1 by brian
clean slate
1525
*/
1526
575.1.2 by Monty Taylor
Changed a bunch of __attribute__((unused)) to removing the parameter name instead.
1527
bool insert_precheck(Session *session, TableList *)
1 by brian
clean slate
1528
{
520.1.22 by Brian Aker
Second pass of thd cleanup
1529
  LEX *lex= session->lex;
1 by brian
clean slate
1530
1531
  /*
1532
    Check that we have modify privileges for the first table and
1533
    select privileges for the rest
1534
  */
1535
  if (lex->update_list.elements != lex->value_list.elements)
1536
  {
1537
    my_message(ER_WRONG_VALUE_COUNT, ER(ER_WRONG_VALUE_COUNT), MYF(0));
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1538
    return(true);
1 by brian
clean slate
1539
  }
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1540
  return(false);
1 by brian
clean slate
1541
}
1542
1543
1544
/**
1545
  CREATE TABLE query pre-check.
1546
520.1.22 by Brian Aker
Second pass of thd cleanup
1547
  @param session			Thread handler
1 by brian
clean slate
1548
  @param tables		Global table list
1549
  @param create_table	        Table which will be created
1550
1551
  @retval
55 by brian
Update for using real bool types.
1552
    false   OK
1 by brian
clean slate
1553
  @retval
55 by brian
Update for using real bool types.
1554
    true   Error
1 by brian
clean slate
1555
*/
1556
1223.4.1 by Brian Aker
Table Identifier patch.
1557
bool create_table_precheck(TableIdentifier &identifier)
1 by brian
clean slate
1558
{
1320.1.8 by Brian Aker
Temporary fix for allowing engines to say "don't do this".
1559
  if (not plugin::StorageEngine::canCreateTable(identifier))
1273.13.1 by Brian Aker
First pass through data dictionary.
1560
  {
1358.1.9 by Brian Aker
Update for std::string
1561
    my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), "", "", identifier.getSchemaName().c_str());
1273.13.1 by Brian Aker
First pass through data dictionary.
1562
    return true;
1563
  }
1 by brian
clean slate
1564
1395.1.12 by Brian Aker
Fixes failure related to Heap's hack on deletion. Also cleans up error
1565
  if (not plugin::StorageEngine::doesSchemaExist(identifier))
1566
  {
1567
    my_error(ER_BAD_DB_ERROR, MYF(0), identifier.getSchemaName().c_str());
1568
    return true;
1569
  }
1570
1223.4.1 by Brian Aker
Table Identifier patch.
1571
  return false;
1 by brian
clean slate
1572
}
1573
1574
1575
/**
1576
  negate given expression.
1577
520.1.22 by Brian Aker
Second pass of thd cleanup
1578
  @param session  thread handler
1 by brian
clean slate
1579
  @param expr expression for negation
1580
1581
  @return
1582
    negated expression
1583
*/
1584
520.1.22 by Brian Aker
Second pass of thd cleanup
1585
Item *negate_expression(Session *session, Item *expr)
1 by brian
clean slate
1586
{
1587
  Item *negated;
1588
  if (expr->type() == Item::FUNC_ITEM &&
1589
      ((Item_func *) expr)->functype() == Item_func::NOT_FUNC)
1590
  {
1591
    /* it is NOT(NOT( ... )) */
1592
    Item *arg= ((Item_func *) expr)->arguments()[0];
520.1.22 by Brian Aker
Second pass of thd cleanup
1593
    enum_parsing_place place= session->lex->current_select->parsing_place;
1 by brian
clean slate
1594
    if (arg->is_bool_func() || place == IN_WHERE || place == IN_HAVING)
1595
      return arg;
1596
    /*
1597
      if it is not boolean function then we have to emulate value of
1598
      not(not(a)), it will be a != 0
1599
    */
1600
    return new Item_func_ne(arg, new Item_int((char*) "0", 0, 1));
1601
  }
1602
520.1.22 by Brian Aker
Second pass of thd cleanup
1603
  if ((negated= expr->neg_transformer(session)) != 0)
1 by brian
clean slate
1604
    return negated;
1605
  return new Item_func_not(expr);
1606
}
1607
1608
1609
/*
1610
  Check that char length of a string does not exceed some limit.
1611
1612
  SYNOPSIS
1613
  check_string_char_length()
1614
      str              string to be checked
1615
      err_msg          error message to be displayed if the string is too long
1616
      max_char_length  max length in symbols
1617
      cs               string charset
1618
1619
  RETURN
55 by brian
Update for using real bool types.
1620
    false   the passed string is not longer than max_char_length
1621
    true    the passed string is longer than max_char_length
1 by brian
clean slate
1622
*/
1623
1624
1625
bool check_string_char_length(LEX_STRING *str, const char *err_msg,
438.1.13 by Brian Aker
uint cleanup.
1626
                              uint32_t max_char_length, const CHARSET_INFO * const cs,
1 by brian
clean slate
1627
                              bool no_error)
1628
{
1629
  int well_formed_error;
438.1.13 by Brian Aker
uint cleanup.
1630
  uint32_t res= cs->cset->well_formed_len(cs, str->str, str->str + str->length,
1 by brian
clean slate
1631
                                      max_char_length, &well_formed_error);
1632
1633
  if (!well_formed_error &&  str->length == res)
55 by brian
Update for using real bool types.
1634
    return false;
1 by brian
clean slate
1635
1636
  if (!no_error)
1637
    my_error(ER_WRONG_STRING_LENGTH, MYF(0), str->str, err_msg, max_char_length);
55 by brian
Update for using real bool types.
1638
  return true;
1 by brian
clean slate
1639
}
1640
1641
575.4.7 by Monty Taylor
More header cleanup.
1642
bool check_identifier_name(LEX_STRING *str, uint32_t err_code,
1643
                           uint32_t max_char_length,
1644
                           const char *param_for_err_msg)
1 by brian
clean slate
1645
{
1646
  /*
1647
    We don't support non-BMP characters in identifiers at the moment,
1648
    so they should be prohibited until such support is done.
1649
    This is why we use the 3-byte utf8 to check well-formedness here.
1650
  */
760 by Brian Aker
Cleanup around UTf8 code.
1651
  const CHARSET_INFO * const cs= &my_charset_utf8mb4_general_ci;
1652
1 by brian
clean slate
1653
  int well_formed_error;
438.1.13 by Brian Aker
uint cleanup.
1654
  uint32_t res= cs->cset->well_formed_len(cs, str->str, str->str + str->length,
1 by brian
clean slate
1655
                                      max_char_length, &well_formed_error);
1656
1657
  if (well_formed_error)
1658
  {
1659
    my_error(ER_INVALID_CHARACTER_STRING, MYF(0), "identifier", str->str);
55 by brian
Update for using real bool types.
1660
    return true;
1 by brian
clean slate
1661
  }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1662
1 by brian
clean slate
1663
  if (str->length == res)
55 by brian
Update for using real bool types.
1664
    return false;
1 by brian
clean slate
1665
1666
  switch (err_code)
1667
  {
1668
  case 0:
1669
    break;
1670
  case ER_WRONG_STRING_LENGTH:
1671
    my_error(err_code, MYF(0), str->str, param_for_err_msg, max_char_length);
1672
    break;
1673
  case ER_TOO_LONG_IDENT:
1674
    my_error(err_code, MYF(0), str->str);
1675
    break;
1676
  default:
51.1.61 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE
1677
    assert(0);
1 by brian
clean slate
1678
    break;
1679
  }
55 by brian
Update for using real bool types.
1680
  return true;
1 by brian
clean slate
1681
}
1682
1683
1684
/**
520.4.50 by Monty Taylor
Finish changing the bison namespace argument from MYSQL to DRIZZLE
1685
  This is a wrapper of DRIZZLEparse(). All the code should call parse_sql()
1686
  instead of DRIZZLEparse().
1 by brian
clean slate
1687
520.1.22 by Brian Aker
Second pass of thd cleanup
1688
  @param session Thread context.
1 by brian
clean slate
1689
  @param lip Lexer context.
1690
1691
  @return Error status.
55 by brian
Update for using real bool types.
1692
    @retval false on success.
1693
    @retval true on parsing error.
1 by brian
clean slate
1694
*/
1695
1165.1.48 by Stewart Smith
make parse_sql static to sql_parse.cc
1696
static bool parse_sql(Session *session, Lex_input_stream *lip)
1 by brian
clean slate
1697
{
520.1.22 by Brian Aker
Second pass of thd cleanup
1698
  assert(session->m_lip == NULL);
1 by brian
clean slate
1699
1932.2.3 by Brian Aker
Updates for D-trace
1700
  DRIZZLE_QUERY_PARSE_START(session->getQueryString()->c_str());
1126.10.15 by Padraig O'Sullivan
Added calls to the parsing related dtrace probes.
1701
1 by brian
clean slate
1702
  /* Set Lex_input_stream. */
1703
520.1.22 by Brian Aker
Second pass of thd cleanup
1704
  session->m_lip= lip;
1 by brian
clean slate
1705
1706
  /* Parse the query. */
1707
520.4.50 by Monty Taylor
Finish changing the bison namespace argument from MYSQL to DRIZZLE
1708
  bool mysql_parse_status= DRIZZLEparse(session) != 0;
520.1.22 by Brian Aker
Second pass of thd cleanup
1709
520.4.50 by Monty Taylor
Finish changing the bison namespace argument from MYSQL to DRIZZLE
1710
  /* Check that if DRIZZLEparse() failed, session->is_error() is set. */
520.1.22 by Brian Aker
Second pass of thd cleanup
1711
1712
  assert(!mysql_parse_status || session->is_error());
1 by brian
clean slate
1713
1714
  /* Reset Lex_input_stream. */
1715
520.1.22 by Brian Aker
Second pass of thd cleanup
1716
  session->m_lip= NULL;
1 by brian
clean slate
1717
1126.10.15 by Padraig O'Sullivan
Added calls to the parsing related dtrace probes.
1718
  DRIZZLE_QUERY_PARSE_DONE(mysql_parse_status || session->is_fatal_error);
1719
1 by brian
clean slate
1720
  /* That's it. */
1721
520.1.22 by Brian Aker
Second pass of thd cleanup
1722
  return mysql_parse_status || session->is_fatal_error;
1 by brian
clean slate
1723
}
1724
1725
/**
1726
  @} (end of group Runtime_Environment)
1727
*/
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
1728
1729
} /* namespace drizzled */