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