~drizzle-trunk/drizzle/development

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