~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-2006 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
17
/* A lexical scanner on a temporary buffer with a yacc interface */
18
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
19
#define DRIZZLE_LEX 1
243.1.17 by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.)
20
#include <drizzled/server_includes.h>
1 by brian
clean slate
21
22
static int lex_one_token(void *arg, void *yythd);
23
24
/*
25
  We are using pointer to this variable for distinguishing between assignment
26
  to NEW row field (when parsing trigger definition) and structured variable.
27
*/
28
29
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
30
31
/**
32
  LEX_STRING constant for null-string to be used in parser and other places.
33
*/
34
const LEX_STRING null_lex_str= {NULL, 0};
35
36
/* Longest standard keyword name */
37
38
#define TOCK_NAME_LENGTH 24
39
40
/*
41
  The following data is based on the latin1 character set, and is only
42
  used when comparing keywords
43
*/
44
45
static uchar to_upper_lex[]=
46
{
47
    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
48
   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
49
   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
50
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
51
   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
52
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
53
   96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
54
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
55
  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
56
  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
57
  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
58
  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
59
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
60
  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
61
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
62
  208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255
63
};
64
65
/* 
66
  Names of the index hints (for error messages). Keep in sync with 
67
  index_hint_type 
68
*/
69
70
const char * index_hint_type_name[] =
71
{
72
  "IGNORE INDEX", 
73
  "USE INDEX", 
74
  "FORCE INDEX"
75
};
76
77
inline int lex_casecmp(const char *s, const char *t, uint len)
78
{
79
  while (len-- != 0 &&
80
	 to_upper_lex[(uchar) *s++] == to_upper_lex[(uchar) *t++]) ;
81
  return (int) len+1;
82
}
83
84
#include <lex_hash.h>
85
86
87
void lex_init(void)
88
{
89
  uint i;
90
  for (i=0 ; i < array_elements(symbols) ; i++)
91
    symbols[i].length=(uchar) strlen(symbols[i].name);
92
  for (i=0 ; i < array_elements(sql_functions) ; i++)
93
    sql_functions[i].length=(uchar) strlen(sql_functions[i].name);
94
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
95
  return;
1 by brian
clean slate
96
}
97
98
99
void lex_free(void)
100
{					// Call this when daemon ends
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
101
  return;
1 by brian
clean slate
102
}
103
104
105
void
106
st_parsing_options::reset()
107
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
108
  allows_variable= true;
109
  allows_select_into= true;
110
  allows_select_procedure= true;
111
  allows_derived= true;
1 by brian
clean slate
112
}
113
114
Lex_input_stream::Lex_input_stream(THD *thd,
115
                                   const char* buffer,
116
                                   unsigned int length)
117
: m_thd(thd),
118
  yylineno(1),
119
  yytoklen(0),
120
  yylval(NULL),
121
  lookahead_token(END_OF_INPUT),
122
  lookahead_yylval(NULL),
123
  m_ptr(buffer),
124
  m_tok_start(NULL),
125
  m_tok_end(NULL),
126
  m_end_of_query(buffer + length),
127
  m_tok_start_prev(NULL),
128
  m_buf(buffer),
129
  m_buf_length(length),
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
130
  m_echo(true),
1 by brian
clean slate
131
  m_cpp_tok_start(NULL),
132
  m_cpp_tok_start_prev(NULL),
133
  m_cpp_tok_end(NULL),
134
  m_body_utf8(NULL),
135
  m_cpp_utf8_processed_ptr(NULL),
136
  next_state(MY_LEX_START),
137
  found_semicolon(NULL),
138
  ignore_space(1),
139
  in_comment(NO_COMMENT),
140
  m_underscore_cs(NULL)
141
{
142
  m_cpp_buf= (char*) thd->alloc(length + 1);
143
  m_cpp_ptr= m_cpp_buf;
144
}
145
146
Lex_input_stream::~Lex_input_stream()
147
{}
148
149
/**
150
  The operation is called from the parser in order to
151
  1) designate the intention to have utf8 body;
152
  1) Indicate to the lexer that we will need a utf8 representation of this
153
     statement;
154
  2) Determine the beginning of the body.
155
156
  @param thd        Thread context.
157
  @param begin_ptr  Pointer to the start of the body in the pre-processed
158
                    buffer.
159
*/
160
161
void Lex_input_stream::body_utf8_start(THD *thd, const char *begin_ptr)
162
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
163
  assert(begin_ptr);
164
  assert(m_cpp_buf <= begin_ptr && begin_ptr <= m_cpp_buf + m_buf_length);
1 by brian
clean slate
165
166
  uint body_utf8_length=
167
    (m_buf_length / thd->variables.character_set_client->mbminlen) *
168
    my_charset_utf8_bin.mbmaxlen;
169
170
  m_body_utf8= (char *) thd->alloc(body_utf8_length + 1);
171
  m_body_utf8_ptr= m_body_utf8;
172
  *m_body_utf8_ptr= 0;
173
174
  m_cpp_utf8_processed_ptr= begin_ptr;
175
}
176
177
/**
178
  @brief The operation appends unprocessed part of pre-processed buffer till
179
  the given pointer (ptr) and sets m_cpp_utf8_processed_ptr to end_ptr.
180
181
  The idea is that some tokens in the pre-processed buffer (like character
182
  set introducers) should be skipped.
183
184
  Example:
185
    CPP buffer: SELECT 'str1', _latin1 'str2';
186
    m_cpp_utf8_processed_ptr -- points at the "SELECT ...";
187
    In order to skip "_latin1", the following call should be made:
188
      body_utf8_append(<pointer to "_latin1 ...">, <pointer to " 'str2'...">)
189
190
  @param ptr      Pointer in the pre-processed buffer, which specifies the
191
                  end of the chunk, which should be appended to the utf8
192
                  body.
193
  @param end_ptr  Pointer in the pre-processed buffer, to which
194
                  m_cpp_utf8_processed_ptr will be set in the end of the
195
                  operation.
196
*/
197
198
void Lex_input_stream::body_utf8_append(const char *ptr,
199
                                        const char *end_ptr)
200
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
201
  assert(m_cpp_buf <= ptr && ptr <= m_cpp_buf + m_buf_length);
202
  assert(m_cpp_buf <= end_ptr && end_ptr <= m_cpp_buf + m_buf_length);
1 by brian
clean slate
203
204
  if (!m_body_utf8)
205
    return;
206
207
  if (m_cpp_utf8_processed_ptr >= ptr)
208
    return;
209
210
  int bytes_to_copy= ptr - m_cpp_utf8_processed_ptr;
211
212
  memcpy(m_body_utf8_ptr, m_cpp_utf8_processed_ptr, bytes_to_copy);
213
  m_body_utf8_ptr += bytes_to_copy;
214
  *m_body_utf8_ptr= 0;
215
216
  m_cpp_utf8_processed_ptr= end_ptr;
217
}
218
219
/**
220
  The operation appends unprocessed part of the pre-processed buffer till
221
  the given pointer (ptr) and sets m_cpp_utf8_processed_ptr to ptr.
222
223
  @param ptr  Pointer in the pre-processed buffer, which specifies the end
224
              of the chunk, which should be appended to the utf8 body.
225
*/
226
227
void Lex_input_stream::body_utf8_append(const char *ptr)
228
{
229
  body_utf8_append(ptr, ptr);
230
}
231
232
/**
233
  The operation converts the specified text literal to the utf8 and appends
234
  the result to the utf8-body.
235
236
  @param thd      Thread context.
237
  @param txt      Text literal.
238
  @param txt_cs   Character set of the text literal.
239
  @param end_ptr  Pointer in the pre-processed buffer, to which
240
                  m_cpp_utf8_processed_ptr will be set in the end of the
241
                  operation.
242
*/
243
244
void Lex_input_stream::body_utf8_append_literal(THD *thd,
245
                                                const LEX_STRING *txt,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
246
                                                const CHARSET_INFO * const txt_cs,
1 by brian
clean slate
247
                                                const char *end_ptr)
248
{
249
  if (!m_cpp_utf8_processed_ptr)
250
    return;
251
252
  LEX_STRING utf_txt;
253
254
  if (!my_charset_same(txt_cs, &my_charset_utf8_general_ci))
255
  {
256
    thd->convert_string(&utf_txt,
257
                        &my_charset_utf8_general_ci,
258
                        txt->str, txt->length,
259
                        txt_cs);
260
  }
261
  else
262
  {
263
    utf_txt.str= txt->str;
264
    utf_txt.length= txt->length;
265
  }
266
267
  /* NOTE: utf_txt.length is in bytes, not in symbols. */
268
269
  memcpy(m_body_utf8_ptr, utf_txt.str, utf_txt.length);
270
  m_body_utf8_ptr += utf_txt.length;
271
  *m_body_utf8_ptr= 0;
272
273
  m_cpp_utf8_processed_ptr= end_ptr;
274
}
275
276
277
/*
278
  This is called before every query that is to be parsed.
279
  Because of this, it's critical to not do too much things here.
280
  (We already do too much here)
281
*/
282
283
void lex_start(THD *thd)
284
{
285
  LEX *lex= thd->lex;
286
287
  lex->thd= lex->unit.thd= thd;
288
289
  lex->context_stack.empty();
290
  lex->unit.init_query();
291
  lex->unit.init_select();
292
  /* 'parent_lex' is used in init_query() so it must be before it. */
293
  lex->select_lex.parent_lex= lex;
294
  lex->select_lex.init_query();
295
  lex->value_list.empty();
296
  lex->update_list.empty();
297
  lex->param_list.empty();
298
  lex->auxiliary_table_list.empty();
299
  lex->unit.next= lex->unit.master=
300
    lex->unit.link_next= lex->unit.return_to= 0;
301
  lex->unit.prev= lex->unit.link_prev= 0;
302
  lex->unit.slave= lex->unit.global_parameters= lex->current_select=
303
    lex->all_selects_list= &lex->select_lex;
304
  lex->select_lex.master= &lex->unit;
305
  lex->select_lex.prev= &lex->unit.slave;
306
  lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0;
307
  lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
308
  lex->select_lex.options= 0;
309
  lex->select_lex.init_order();
310
  lex->select_lex.group_list.empty();
311
  lex->describe= 0;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
312
  lex->subqueries= false;
1 by brian
clean slate
313
  lex->derived_tables= 0;
314
  lex->lock_option= TL_READ;
315
  lex->leaf_tables_insert= 0;
316
  lex->parsing_options.reset();
317
  lex->empty_field_list_on_rset= 0;
318
  lex->select_lex.select_number= 1;
319
  lex->length=0;
320
  lex->select_lex.in_sum_expr=0;
321
  lex->select_lex.ftfunc_list_alloc.empty();
322
  lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
323
  lex->select_lex.group_list.empty();
324
  lex->select_lex.order_list.empty();
325
  lex->sql_command= SQLCOM_END;
326
  lex->duplicates= DUP_ERROR;
327
  lex->ignore= 0;
328
  lex->proc_list.first= 0;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
329
  lex->escape_used= false;
1 by brian
clean slate
330
  lex->query_tables= 0;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
331
  lex->reset_query_tables_list(false);
332
  lex->expr_allows_subselect= true;
333
  lex->use_only_table_context= false;
1 by brian
clean slate
334
335
  lex->name.str= 0;
336
  lex->name.length= 0;
337
  lex->nest_level=0 ;
338
  lex->allow_sum_func= 0;
339
  lex->in_sum_func= NULL;
340
  /*
341
    ok, there must be a better solution for this, long-term
212.6.1 by Mats Kindahl
Replacing all bzero() calls with memset() calls and removing the bzero.c file.
342
    I tried "memset" in the sql_yacc.yy code, but that for
1 by brian
clean slate
343
    some reason made the values zero, even if they were set
344
  */
345
  lex->server_options.server_name= 0;
346
  lex->server_options.server_name_length= 0;
347
  lex->server_options.host= 0;
348
  lex->server_options.db= 0;
349
  lex->server_options.username= 0;
350
  lex->server_options.password= 0;
351
  lex->server_options.scheme= 0;
352
  lex->server_options.owner= 0;
353
  lex->server_options.port= -1;
354
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
355
  lex->is_lex_started= true;
356
  return;
1 by brian
clean slate
357
}
358
359
void lex_end(LEX *lex)
360
{
361
  if (lex->yacc_yyss)
362
  {
363
    my_free(lex->yacc_yyss, MYF(0));
364
    my_free(lex->yacc_yyvs, MYF(0));
365
    lex->yacc_yyss= 0;
366
    lex->yacc_yyvs= 0;
367
  }
368
369
  /* release used plugins */
370
  plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer, 
371
                     lex->plugins.elements);
372
  reset_dynamic(&lex->plugins);
373
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
374
  return;
1 by brian
clean slate
375
}
376
377
378
static int find_keyword(Lex_input_stream *lip, uint len, bool function)
379
{
380
  const char *tok= lip->get_tok_start();
381
382
  SYMBOL *symbol= get_hash_symbol(tok, len, function);
383
  if (symbol)
384
  {
385
    lip->yylval->symbol.symbol=symbol;
386
    lip->yylval->symbol.str= (char*) tok;
387
    lip->yylval->symbol.length=len;
388
389
    return symbol->tok;
390
  }
391
  return 0;
392
}
393
394
/*
395
  Check if name is a keyword
396
397
  SYNOPSIS
398
    is_keyword()
399
    name      checked name (must not be empty)
400
    len       length of checked name
401
402
  RETURN VALUES
403
    0         name is a keyword
404
    1         name isn't a keyword
405
*/
406
407
bool is_keyword(const char *name, uint len)
408
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
409
  assert(len != 0);
1 by brian
clean slate
410
  return get_hash_symbol(name,len,0)!=0;
411
}
412
413
bool is_lex_native_function(const LEX_STRING *name)
414
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
415
  assert(name != NULL);
1 by brian
clean slate
416
  return (get_hash_symbol(name->str, name->length, 1) != 0);
417
}
418
419
/* make a copy of token before ptr and set yytoklen */
420
421
static LEX_STRING get_token(Lex_input_stream *lip, uint skip, uint length)
422
{
423
  LEX_STRING tmp;
424
  lip->yyUnget();                       // ptr points now after last token char
425
  tmp.length=lip->yytoklen=length;
426
  tmp.str= lip->m_thd->strmake(lip->get_tok_start() + skip, tmp.length);
427
428
  lip->m_cpp_text_start= lip->get_cpp_tok_start() + skip;
429
  lip->m_cpp_text_end= lip->m_cpp_text_start + tmp.length;
430
431
  return tmp;
432
}
433
434
/* 
435
 todo: 
436
   There are no dangerous charsets in mysql for function 
437
   get_quoted_token yet. But it should be fixed in the 
438
   future to operate multichar strings (like ucs2)
439
*/
440
441
static LEX_STRING get_quoted_token(Lex_input_stream *lip,
442
                                   uint skip,
443
                                   uint length, char quote)
444
{
445
  LEX_STRING tmp;
446
  const char *from, *end;
447
  char *to;
448
  lip->yyUnget();                       // ptr points now after last token char
449
  tmp.length= lip->yytoklen=length;
450
  tmp.str=(char*) lip->m_thd->alloc(tmp.length+1);
451
  from= lip->get_tok_start() + skip;
452
  to= tmp.str;
453
  end= to+length;
454
455
  lip->m_cpp_text_start= lip->get_cpp_tok_start() + skip;
456
  lip->m_cpp_text_end= lip->m_cpp_text_start + length;
457
458
  for ( ; to != end; )
459
  {
460
    if ((*to++= *from++) == quote)
461
    {
462
      from++;					// Skip double quotes
463
      lip->m_cpp_text_start++;
464
    }
465
  }
466
  *to= 0;					// End null for safety
467
  return tmp;
468
}
469
470
471
/*
472
  Return an unescaped text literal without quotes
473
  Fix sometimes to do only one scan of the string
474
*/
475
476
static char *get_text(Lex_input_stream *lip, int pre_skip, int post_skip)
477
{
478
  register uchar c,sep;
479
  uint found_escape=0;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
480
  const CHARSET_INFO * const cs= lip->m_thd->charset();
1 by brian
clean slate
481
482
  lip->tok_bitmap= 0;
483
  sep= lip->yyGetLast();                        // String should end with this
484
  while (! lip->eof())
485
  {
486
    c= lip->yyGet();
487
    lip->tok_bitmap|= c;
488
#ifdef USE_MB
489
    {
490
      int l;
491
      if (use_mb(cs) &&
492
          (l = my_ismbchar(cs,
493
                           lip->get_ptr() -1,
494
                           lip->get_end_of_query()))) {
495
        lip->skip_binary(l-1);
496
        continue;
497
      }
498
    }
499
#endif
500
    if (c == '\\')
501
    {					// Escaped character
502
      found_escape=1;
503
      if (lip->eof())
504
	return 0;
505
      lip->yySkip();
506
    }
507
    else if (c == sep)
508
    {
509
      if (c == lip->yyGet())            // Check if two separators in a row
510
      {
511
        found_escape=1;                 // duplicate. Remember for delete
512
	continue;
513
      }
514
      else
515
        lip->yyUnget();
516
517
      /* Found end. Unescape and return string */
518
      const char *str, *end;
519
      char *start;
520
521
      str= lip->get_tok_start();
522
      end= lip->get_ptr();
523
      /* Extract the text from the token */
524
      str += pre_skip;
525
      end -= post_skip;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
526
      assert(end >= str);
1 by brian
clean slate
527
528
      if (!(start= (char*) lip->m_thd->alloc((uint) (end-str)+1)))
529
	return (char*) "";		// Sql_alloc has set error flag
530
531
      lip->m_cpp_text_start= lip->get_cpp_tok_start() + pre_skip;
532
      lip->m_cpp_text_end= lip->get_cpp_ptr() - post_skip;
533
534
      if (!found_escape)
535
      {
536
	lip->yytoklen=(uint) (end-str);
537
	memcpy(start,str,lip->yytoklen);
538
	start[lip->yytoklen]=0;
539
      }
540
      else
541
      {
542
        char *to;
543
544
	for (to=start ; str != end ; str++)
545
	{
546
#ifdef USE_MB
547
	  int l;
548
	  if (use_mb(cs) &&
549
              (l = my_ismbchar(cs, str, end))) {
550
	      while (l--)
551
		  *to++ = *str++;
552
	      str--;
553
	      continue;
554
	  }
555
#endif
360 by Brian Aker
More MODE removal.
556
	  if (*str == '\\' && str+1 != end)
1 by brian
clean slate
557
	  {
558
	    switch(*++str) {
559
	    case 'n':
560
	      *to++='\n';
561
	      break;
562
	    case 't':
563
	      *to++= '\t';
564
	      break;
565
	    case 'r':
566
	      *to++ = '\r';
567
	      break;
568
	    case 'b':
569
	      *to++ = '\b';
570
	      break;
571
	    case '0':
572
	      *to++= 0;			// Ascii null
573
	      break;
574
	    case 'Z':			// ^Z must be escaped on Win32
575
	      *to++='\032';
576
	      break;
577
	    case '_':
578
	    case '%':
579
	      *to++= '\\';		// remember prefix for wildcard
580
	      /* Fall through */
581
	    default:
582
              *to++= *str;
583
	      break;
584
	    }
585
	  }
586
	  else if (*str == sep)
587
	    *to++= *str++;		// Two ' or "
588
	  else
589
	    *to++ = *str;
590
	}
591
	*to=0;
592
	lip->yytoklen=(uint) (to-start);
593
      }
594
      return start;
595
    }
596
  }
597
  return 0;					// unexpected end of query
598
}
599
600
601
/*
152 by Brian Aker
longlong replacement
602
** Calc type of integer; long integer, int64_t integer or real.
1 by brian
clean slate
603
** Returns smallest type that match the string.
604
** When using unsigned long long values the result is converted to a real
605
** because else they will be unexpected sign changes because all calculation
152 by Brian Aker
longlong replacement
606
** is done with int64_t or double.
1 by brian
clean slate
607
*/
608
609
static const char *long_str="2147483647";
610
static const uint long_len=10;
611
static const char *signed_long_str="-2147483648";
152 by Brian Aker
longlong replacement
612
static const char *int64_t_str="9223372036854775807";
613
static const uint int64_t_len=19;
614
static const char *signed_int64_t_str="-9223372036854775808";
615
static const uint signed_int64_t_len=19;
616
static const char *unsigned_int64_t_str="18446744073709551615";
617
static const uint unsigned_int64_t_len=20;
1 by brian
clean slate
618
619
static inline uint int_token(const char *str,uint length)
620
{
621
  if (length < long_len)			// quick normal case
622
    return NUM;
623
  bool neg=0;
624
625
  if (*str == '+')				// Remove sign and pre-zeros
626
  {
627
    str++; length--;
628
  }
629
  else if (*str == '-')
630
  {
631
    str++; length--;
632
    neg=1;
633
  }
634
  while (*str == '0' && length)
635
  {
636
    str++; length --;
637
  }
638
  if (length < long_len)
639
    return NUM;
640
641
  uint smaller,bigger;
642
  const char *cmp;
643
  if (neg)
644
  {
645
    if (length == long_len)
646
    {
647
      cmp= signed_long_str+1;
648
      smaller=NUM;				// If <= signed_long_str
649
      bigger=LONG_NUM;				// If >= signed_long_str
650
    }
152 by Brian Aker
longlong replacement
651
    else if (length < signed_int64_t_len)
1 by brian
clean slate
652
      return LONG_NUM;
152 by Brian Aker
longlong replacement
653
    else if (length > signed_int64_t_len)
1 by brian
clean slate
654
      return DECIMAL_NUM;
655
    else
656
    {
152 by Brian Aker
longlong replacement
657
      cmp=signed_int64_t_str+1;
658
      smaller=LONG_NUM;				// If <= signed_int64_t_str
1 by brian
clean slate
659
      bigger=DECIMAL_NUM;
660
    }
661
  }
662
  else
663
  {
664
    if (length == long_len)
665
    {
666
      cmp= long_str;
667
      smaller=NUM;
668
      bigger=LONG_NUM;
669
    }
152 by Brian Aker
longlong replacement
670
    else if (length < int64_t_len)
1 by brian
clean slate
671
      return LONG_NUM;
152 by Brian Aker
longlong replacement
672
    else if (length > int64_t_len)
1 by brian
clean slate
673
    {
152 by Brian Aker
longlong replacement
674
      if (length > unsigned_int64_t_len)
1 by brian
clean slate
675
        return DECIMAL_NUM;
152 by Brian Aker
longlong replacement
676
      cmp=unsigned_int64_t_str;
1 by brian
clean slate
677
      smaller=ULONGLONG_NUM;
678
      bigger=DECIMAL_NUM;
679
    }
680
    else
681
    {
152 by Brian Aker
longlong replacement
682
      cmp=int64_t_str;
1 by brian
clean slate
683
      smaller=LONG_NUM;
684
      bigger= ULONGLONG_NUM;
685
    }
686
  }
687
  while (*cmp && *cmp++ == *str++) ;
688
  return ((uchar) str[-1] <= (uchar) cmp[-1]) ? smaller : bigger;
689
}
690
691
692
/*
693
  MYSQLlex remember the following states from the following MYSQLlex()
694
695
  - MY_LEX_EOQ			Found end of query
696
  - MY_LEX_OPERATOR_OR_IDENT	Last state was an ident, text or number
697
				(which can't be followed by a signed number)
698
*/
699
700
int MYSQLlex(void *arg, void *yythd)
701
{
702
  THD *thd= (THD *)yythd;
703
  Lex_input_stream *lip= thd->m_lip;
704
  YYSTYPE *yylval=(YYSTYPE*) arg;
705
  int token;
706
707
  if (lip->lookahead_token != END_OF_INPUT)
708
  {
709
    /*
710
      The next token was already parsed in advance,
711
      return it.
712
    */
713
    token= lip->lookahead_token;
714
    lip->lookahead_token= END_OF_INPUT;
715
    *yylval= *(lip->lookahead_yylval);
716
    lip->lookahead_yylval= NULL;
717
    return token;
718
  }
719
720
  token= lex_one_token(arg, yythd);
721
722
  switch(token) {
723
  case WITH:
724
    /*
725
      Parsing 'WITH' 'ROLLUP' or 'WITH' 'CUBE' requires 2 look ups,
726
      which makes the grammar LALR(2).
727
      Replace by a single 'WITH_ROLLUP' or 'WITH_CUBE' token,
728
      to transform the grammar into a LALR(1) grammar,
729
      which sql_yacc.yy can process.
730
    */
731
    token= lex_one_token(arg, yythd);
732
    switch(token) {
733
    case CUBE_SYM:
734
      return WITH_CUBE_SYM;
735
    case ROLLUP_SYM:
736
      return WITH_ROLLUP_SYM;
737
    default:
738
      /*
739
        Save the token following 'WITH'
740
      */
741
      lip->lookahead_yylval= lip->yylval;
742
      lip->yylval= NULL;
743
      lip->lookahead_token= token;
744
      return WITH;
745
    }
746
    break;
747
  default:
748
    break;
749
  }
750
751
  return token;
752
}
753
754
int lex_one_token(void *arg, void *yythd)
755
{
756
  register unsigned char c= 0; /* Just set to shutup GCC */
757
  bool comment_closed;
758
  int	tokval, result_state;
759
  unsigned int length;
760
  enum my_lex_states state;
761
  THD *thd= (THD *)yythd;
762
  Lex_input_stream *lip= thd->m_lip;
763
  LEX *lex= thd->lex;
764
  YYSTYPE *yylval=(YYSTYPE*) arg;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
765
  const CHARSET_INFO * const cs= thd->charset();
1 by brian
clean slate
766
  uchar *state_map= cs->state_map;
767
  uchar *ident_map= cs->ident_map;
768
769
  lip->yylval=yylval;			// The global state
770
771
  lip->start_token();
772
  state=lip->next_state;
773
  lip->next_state=MY_LEX_OPERATOR_OR_IDENT;
774
  for (;;)
775
  {
776
    switch (state) {
777
    case MY_LEX_OPERATOR_OR_IDENT:	// Next is operator or keyword
778
    case MY_LEX_START:			// Start of token
779
      // Skip starting whitespace
780
      while(state_map[c= lip->yyPeek()] == MY_LEX_SKIP)
781
      {
782
	if (c == '\n')
783
	  lip->yylineno++;
784
785
        lip->yySkip();
786
      }
787
788
      /* Start of real token */
789
      lip->restart_token();
790
      c= lip->yyGet();
791
      state= (enum my_lex_states) state_map[c];
792
      break;
793
    case MY_LEX_ESCAPE:
794
      if (lip->yyGet() == 'N')
795
      {					// Allow \N as shortcut for NULL
796
	yylval->lex_str.str=(char*) "\\N";
797
	yylval->lex_str.length=2;
798
	return NULL_SYM;
799
      }
800
    case MY_LEX_CHAR:			// Unknown or single char token
801
    case MY_LEX_SKIP:			// This should not happen
802
      if (c == '-' && lip->yyPeek() == '-' &&
803
          (my_isspace(cs,lip->yyPeekn(1)) ||
804
           my_iscntrl(cs,lip->yyPeekn(1))))
805
      {
806
        state=MY_LEX_COMMENT;
807
        break;
808
      }
809
810
      if (c != ')')
811
	lip->next_state= MY_LEX_START;	// Allow signed numbers
812
813
      if (c == ',')
814
      {
815
        /*
816
          Warning:
817
          This is a work around, to make the "remember_name" rule in
818
          sql/sql_yacc.yy work properly.
819
          The problem is that, when parsing "select expr1, expr2",
820
          the code generated by bison executes the *pre* action
821
          remember_name (see select_item) *before* actually parsing the
822
          first token of expr2.
823
        */
824
        lip->restart_token();
825
      }
826
827
      return((int) c);
828
829
    case MY_LEX_IDENT_OR_HEX:
830
      if (lip->yyPeek() == '\'')
831
      {					// Found x'hex-number'
832
	state= MY_LEX_HEX_NUMBER;
833
	break;
834
      }
835
    case MY_LEX_IDENT_OR_BIN:
836
      if (lip->yyPeek() == '\'')
837
      {                                 // Found b'bin-number'
838
        state= MY_LEX_BIN_NUMBER;
839
        break;
840
      }
841
    case MY_LEX_IDENT:
842
      const char *start;
843
#if defined(USE_MB) && defined(USE_MB_IDENT)
844
      if (use_mb(cs))
845
      {
846
	result_state= IDENT_QUOTED;
847
        if (my_mbcharlen(cs, lip->yyGetLast()) > 1)
848
        {
849
          int l = my_ismbchar(cs,
850
                              lip->get_ptr() -1,
851
                              lip->get_end_of_query());
852
          if (l == 0) {
853
            state = MY_LEX_CHAR;
854
            continue;
855
          }
856
          lip->skip_binary(l - 1);
857
        }
858
        while (ident_map[c=lip->yyGet()])
859
        {
860
          if (my_mbcharlen(cs, c) > 1)
861
          {
862
            int l;
863
            if ((l = my_ismbchar(cs,
864
                                 lip->get_ptr() -1,
865
                                 lip->get_end_of_query())) == 0)
866
              break;
867
            lip->skip_binary(l-1);
868
          }
869
        }
870
      }
871
      else
872
#endif
873
      {
874
        for (result_state= c; ident_map[c= lip->yyGet()]; result_state|= c) {};
875
        /* If there were non-ASCII characters, mark that we must convert */
876
        result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
877
      }
878
      length= lip->yyLength();
879
      start= lip->get_ptr();
880
      if (lip->ignore_space)
881
      {
882
        /*
883
          If we find a space then this can't be an identifier. We notice this
884
          below by checking start != lex->ptr.
885
        */
886
        for (; state_map[c] == MY_LEX_SKIP ; c= lip->yyGet()) {};
887
      }
888
      if (start == lip->get_ptr() && c == '.' && ident_map[(uint8_t)lip->yyPeek()])
889
	lip->next_state=MY_LEX_IDENT_SEP;
890
      else
891
      {					// '(' must follow directly if function
892
        lip->yyUnget();
893
	if ((tokval = find_keyword(lip, length, c == '(')))
894
	{
895
	  lip->next_state= MY_LEX_START;	// Allow signed numbers
896
	  return(tokval);		// Was keyword
897
	}
898
        lip->yySkip();                  // next state does a unget
899
      }
900
      yylval->lex_str=get_token(lip, 0, length);
901
902
      /*
903
         Note: "SELECT _bla AS 'alias'"
904
         _bla should be considered as a IDENT if charset haven't been found.
905
         So we don't use MYF(MY_WME) with get_charset_by_csname to avoid
906
         producing an error.
907
      */
908
909
      if (yylval->lex_str.str[0] == '_')
910
      {
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
911
        const CHARSET_INFO * const cs= get_charset_by_csname(yylval->lex_str.str + 1,
912
                                                             MY_CS_PRIMARY, MYF(0));
1 by brian
clean slate
913
        if (cs)
914
        {
915
          yylval->charset= cs;
916
          lip->m_underscore_cs= cs;
917
918
          lip->body_utf8_append(lip->m_cpp_text_start,
919
                                lip->get_cpp_tok_start() + length);
920
          return(UNDERSCORE_CHARSET);
921
        }
922
      }
923
924
      lip->body_utf8_append(lip->m_cpp_text_start);
925
926
      lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
927
                                    lip->m_cpp_text_end);
928
929
      return(result_state);			// IDENT or IDENT_QUOTED
930
931
    case MY_LEX_IDENT_SEP:		// Found ident and now '.'
932
      yylval->lex_str.str= (char*) lip->get_ptr();
933
      yylval->lex_str.length= 1;
934
      c= lip->yyGet();                  // should be '.'
935
      lip->next_state= MY_LEX_IDENT_START;// Next is an ident (not a keyword)
936
      if (!ident_map[(uint8_t)lip->yyPeek()])            // Probably ` or "
937
	lip->next_state= MY_LEX_START;
938
      return((int) c);
939
940
    case MY_LEX_NUMBER_IDENT:		// number or ident which num-start
941
      if (lip->yyGetLast() == '0')
942
      {
943
        c= lip->yyGet();
944
        if (c == 'x')
945
        {
946
          while (my_isxdigit(cs,(c = lip->yyGet()))) ;
947
          if ((lip->yyLength() >= 3) && !ident_map[c])
948
          {
949
            /* skip '0x' */
950
            yylval->lex_str=get_token(lip, 2, lip->yyLength()-2);
951
            return (HEX_NUM);
952
          }
953
          lip->yyUnget();
954
          state= MY_LEX_IDENT_START;
955
          break;
956
        }
957
        else if (c == 'b')
958
        {
959
          while ((c= lip->yyGet()) == '0' || c == '1') {};
960
          if ((lip->yyLength() >= 3) && !ident_map[c])
961
          {
962
            /* Skip '0b' */
963
            yylval->lex_str= get_token(lip, 2, lip->yyLength()-2);
964
            return (BIN_NUM);
965
          }
966
          lip->yyUnget();
967
          state= MY_LEX_IDENT_START;
968
          break;
969
        }
970
        lip->yyUnget();
971
      }
972
973
      while (my_isdigit(cs, (c = lip->yyGet()))) ;
974
      if (!ident_map[c])
975
      {					// Can't be identifier
976
	state=MY_LEX_INT_OR_REAL;
977
	break;
978
      }
979
      if (c == 'e' || c == 'E')
980
      {
981
	// The following test is written this way to allow numbers of type 1e1
982
        if (my_isdigit(cs,lip->yyPeek()) ||
983
            (c=(lip->yyGet())) == '+' || c == '-')
984
	{				// Allow 1E+10
985
          if (my_isdigit(cs,lip->yyPeek()))     // Number must have digit after sign
986
	  {
987
            lip->yySkip();
988
            while (my_isdigit(cs,lip->yyGet())) ;
989
            yylval->lex_str=get_token(lip, 0, lip->yyLength());
990
	    return(FLOAT_NUM);
991
	  }
992
	}
993
        lip->yyUnget();
994
      }
995
      // fall through
996
    case MY_LEX_IDENT_START:			// We come here after '.'
997
      result_state= IDENT;
998
#if defined(USE_MB) && defined(USE_MB_IDENT)
999
      if (use_mb(cs))
1000
      {
1001
	result_state= IDENT_QUOTED;
1002
        while (ident_map[c=lip->yyGet()])
1003
        {
1004
          if (my_mbcharlen(cs, c) > 1)
1005
          {
1006
            int l;
1007
            if ((l = my_ismbchar(cs,
1008
                                 lip->get_ptr() -1,
1009
                                 lip->get_end_of_query())) == 0)
1010
              break;
1011
            lip->skip_binary(l-1);
1012
          }
1013
        }
1014
      }
1015
      else
1016
#endif
1017
      {
1018
        for (result_state=0; ident_map[c= lip->yyGet()]; result_state|= c) {};
1019
        /* If there were non-ASCII characters, mark that we must convert */
1020
        result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
1021
      }
1022
      if (c == '.' && ident_map[(uint8_t)lip->yyPeek()])
1023
	lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
1024
1025
      yylval->lex_str= get_token(lip, 0, lip->yyLength());
1026
1027
      lip->body_utf8_append(lip->m_cpp_text_start);
1028
1029
      lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1030
                                    lip->m_cpp_text_end);
1031
1032
      return(result_state);
1033
1034
    case MY_LEX_USER_VARIABLE_DELIMITER:	// Found quote char
1035
    {
1036
      uint double_quotes= 0;
1037
      char quote_char= c;                       // Used char
1038
      while ((c=lip->yyGet()))
1039
      {
1040
	int var_length;
1041
	if ((var_length= my_mbcharlen(cs, c)) == 1)
1042
	{
1043
	  if (c == quote_char)
1044
	  {
1045
            if (lip->yyPeek() != quote_char)
1046
	      break;
1047
            c=lip->yyGet();
1048
	    double_quotes++;
1049
	    continue;
1050
	  }
1051
	}
1052
#ifdef USE_MB
1053
	else if (var_length < 1)
1054
	  break;				// Error
1055
        lip->skip_binary(var_length-1);
1056
#endif
1057
      }
1058
      if (double_quotes)
1059
	yylval->lex_str=get_quoted_token(lip, 1,
1060
                                         lip->yyLength() - double_quotes -1,
1061
					 quote_char);
1062
      else
1063
        yylval->lex_str=get_token(lip, 1, lip->yyLength() -1);
1064
      if (c == quote_char)
1065
        lip->yySkip();                  // Skip end `
1066
      lip->next_state= MY_LEX_START;
1067
1068
      lip->body_utf8_append(lip->m_cpp_text_start);
1069
1070
      lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1071
                                    lip->m_cpp_text_end);
1072
1073
      return(IDENT_QUOTED);
1074
    }
1075
    case MY_LEX_INT_OR_REAL:		// Complete int or incomplete real
1076
      if (c != '.')
1077
      {					// Found complete integer number.
1078
        yylval->lex_str=get_token(lip, 0, lip->yyLength());
1079
	return int_token(yylval->lex_str.str,yylval->lex_str.length);
1080
      }
1081
      // fall through
1082
    case MY_LEX_REAL:			// Incomplete real number
1083
      while (my_isdigit(cs,c = lip->yyGet())) ;
1084
1085
      if (c == 'e' || c == 'E')
1086
      {
1087
        c = lip->yyGet();
1088
	if (c == '-' || c == '+')
1089
          c = lip->yyGet();                     // Skip sign
1090
	if (!my_isdigit(cs,c))
1091
	{				// No digit after sign
1092
	  state= MY_LEX_CHAR;
1093
	  break;
1094
	}
1095
        while (my_isdigit(cs,lip->yyGet())) ;
1096
        yylval->lex_str=get_token(lip, 0, lip->yyLength());
1097
	return(FLOAT_NUM);
1098
      }
1099
      yylval->lex_str=get_token(lip, 0, lip->yyLength());
1100
      return(DECIMAL_NUM);
1101
1102
    case MY_LEX_HEX_NUMBER:		// Found x'hexstring'
1103
      lip->yySkip();                    // Accept opening '
1104
      while (my_isxdigit(cs, (c= lip->yyGet()))) ;
1105
      if (c != '\'')
1106
        return(ABORT_SYM);              // Illegal hex constant
1107
      lip->yySkip();                    // Accept closing '
1108
      length= lip->yyLength();          // Length of hexnum+3
1109
      if ((length % 2) == 0)
1110
        return(ABORT_SYM);              // odd number of hex digits
1111
      yylval->lex_str=get_token(lip,
1112
                                2,          // skip x'
1113
                                length-3);  // don't count x' and last '
1114
      return (HEX_NUM);
1115
1116
    case MY_LEX_BIN_NUMBER:           // Found b'bin-string'
1117
      lip->yySkip();                  // Accept opening '
1118
      while ((c= lip->yyGet()) == '0' || c == '1') {};
1119
      if (c != '\'')
1120
        return(ABORT_SYM);            // Illegal hex constant
1121
      lip->yySkip();                  // Accept closing '
1122
      length= lip->yyLength();        // Length of bin-num + 3
1123
      yylval->lex_str= get_token(lip,
1124
                                 2,         // skip b'
1125
                                 length-3); // don't count b' and last '
1126
      return (BIN_NUM);
1127
1128
    case MY_LEX_CMP_OP:			// Incomplete comparison operator
1129
      if (state_map[(uint8_t)lip->yyPeek()] == MY_LEX_CMP_OP ||
1130
          state_map[(uint8_t)lip->yyPeek()] == MY_LEX_LONG_CMP_OP)
1131
        lip->yySkip();
1132
      if ((tokval = find_keyword(lip, lip->yyLength() + 1, 0)))
1133
      {
1134
	lip->next_state= MY_LEX_START;	// Allow signed numbers
1135
	return(tokval);
1136
      }
1137
      state = MY_LEX_CHAR;		// Something fishy found
1138
      break;
1139
1140
    case MY_LEX_LONG_CMP_OP:		// Incomplete comparison operator
1141
      if (state_map[(uint8_t)lip->yyPeek()] == MY_LEX_CMP_OP ||
1142
          state_map[(uint8_t)lip->yyPeek()] == MY_LEX_LONG_CMP_OP)
1143
      {
1144
        lip->yySkip();
1145
        if (state_map[(uint8_t)lip->yyPeek()] == MY_LEX_CMP_OP)
1146
          lip->yySkip();
1147
      }
1148
      if ((tokval = find_keyword(lip, lip->yyLength() + 1, 0)))
1149
      {
1150
	lip->next_state= MY_LEX_START;	// Found long op
1151
	return(tokval);
1152
      }
1153
      state = MY_LEX_CHAR;		// Something fishy found
1154
      break;
1155
1156
    case MY_LEX_BOOL:
1157
      if (c != lip->yyPeek())
1158
      {
1159
	state=MY_LEX_CHAR;
1160
	break;
1161
      }
1162
      lip->yySkip();
1163
      tokval = find_keyword(lip,2,0);	// Is a bool operator
1164
      lip->next_state= MY_LEX_START;	// Allow signed numbers
1165
      return(tokval);
1166
1167
    case MY_LEX_STRING_OR_DELIMITER:
1168
      if (0)
1169
      {
1170
        state= MY_LEX_USER_VARIABLE_DELIMITER;
1171
        break;
1172
      }
1173
      /* " used for strings */
1174
    case MY_LEX_STRING:			// Incomplete text string
1175
      if (!(yylval->lex_str.str = get_text(lip, 1, 1)))
1176
      {
1177
	state= MY_LEX_CHAR;		// Read char by char
1178
	break;
1179
      }
1180
      yylval->lex_str.length=lip->yytoklen;
1181
1182
      lip->body_utf8_append(lip->m_cpp_text_start);
1183
1184
      lip->body_utf8_append_literal(thd, &yylval->lex_str,
1185
        lip->m_underscore_cs ? lip->m_underscore_cs : cs,
1186
        lip->m_cpp_text_end);
1187
1188
      lip->m_underscore_cs= NULL;
1189
1190
      lex->text_string_is_7bit= (lip->tok_bitmap & 0x80) ? 0 : 1;
1191
      return(TEXT_STRING);
1192
1193
    case MY_LEX_COMMENT:			//  Comment
1194
      lex->select_lex.options|= OPTION_FOUND_COMMENT;
1195
      while ((c = lip->yyGet()) != '\n' && c) ;
1196
      lip->yyUnget();                   // Safety against eof
1197
      state = MY_LEX_START;		// Try again
1198
      break;
1199
    case MY_LEX_LONG_COMMENT:		/* Long C comment? */
1200
      if (lip->yyPeek() != '*')
1201
      {
1202
	state=MY_LEX_CHAR;		// Probable division
1203
	break;
1204
      }
1205
      lex->select_lex.options|= OPTION_FOUND_COMMENT;
1206
      /* Reject '/' '*', since we might need to turn off the echo */
1207
      lip->yyUnget();
1208
1209
      if (lip->yyPeekn(2) == '!')
1210
      {
1211
        lip->in_comment= DISCARD_COMMENT;
1212
        /* Accept '/' '*' '!', but do not keep this marker. */
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1213
        lip->set_echo(false);
1 by brian
clean slate
1214
        lip->yySkip();
1215
        lip->yySkip();
1216
        lip->yySkip();
1217
1218
        /*
1219
          The special comment format is very strict:
1220
          '/' '*' '!', followed by exactly
1221
          1 digit (major), 2 digits (minor), then 2 digits (dot).
1222
          32302 -> 3.23.02
1223
          50032 -> 5.0.32
1224
          50114 -> 5.1.14
1225
        */
1226
        char version_str[6];
1227
        version_str[0]= lip->yyPeekn(0);
1228
        version_str[1]= lip->yyPeekn(1);
1229
        version_str[2]= lip->yyPeekn(2);
1230
        version_str[3]= lip->yyPeekn(3);
1231
        version_str[4]= lip->yyPeekn(4);
1232
        version_str[5]= 0;
1233
        if (  my_isdigit(cs, version_str[0])
1234
           && my_isdigit(cs, version_str[1])
1235
           && my_isdigit(cs, version_str[2])
1236
           && my_isdigit(cs, version_str[3])
1237
           && my_isdigit(cs, version_str[4])
1238
           )
1239
        {
1240
          ulong version;
1241
          version=strtol(version_str, NULL, 10);
1242
1243
          /* Accept 'M' 'm' 'm' 'd' 'd' */
1244
          lip->yySkipn(5);
1245
319.1.1 by Grant Limberg
renamed all instances of MYSQL_ to DRIZZLE_
1246
          if (version <= DRIZZLE_VERSION_ID)
1 by brian
clean slate
1247
          {
1248
            /* Expand the content of the special comment as real code */
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1249
            lip->set_echo(true);
1 by brian
clean slate
1250
            state=MY_LEX_START;
1251
            break;
1252
          }
1253
        }
1254
        else
1255
        {
1256
          state=MY_LEX_START;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1257
          lip->set_echo(true);
1 by brian
clean slate
1258
          break;
1259
        }
1260
      }
1261
      else
1262
      {
1263
        lip->in_comment= PRESERVE_COMMENT;
1264
        lip->yySkip();                  // Accept /
1265
        lip->yySkip();                  // Accept *
1266
      }
1267
      /*
1268
        Discard:
1269
        - regular '/' '*' comments,
1270
        - special comments '/' '*' '!' for a future version,
1271
        by scanning until we find a closing '*' '/' marker.
1272
        Note: There is no such thing as nesting comments,
1273
        the first '*' '/' sequence seen will mark the end.
1274
      */
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1275
      comment_closed= false;
1 by brian
clean slate
1276
      while (! lip->eof())
1277
      {
1278
        c= lip->yyGet();
1279
        if (c == '*')
1280
        {
1281
          if (lip->yyPeek() == '/')
1282
          {
1283
            lip->yySkip();
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1284
            comment_closed= true;
1 by brian
clean slate
1285
            state = MY_LEX_START;
1286
            break;
1287
          }
1288
        }
1289
        else if (c == '\n')
1290
          lip->yylineno++;
1291
      }
1292
      /* Unbalanced comments with a missing '*' '/' are a syntax error */
1293
      if (! comment_closed)
1294
        return (ABORT_SYM);
1295
      state = MY_LEX_START;             // Try again
1296
      lip->in_comment= NO_COMMENT;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1297
      lip->set_echo(true);
1 by brian
clean slate
1298
      break;
1299
    case MY_LEX_END_LONG_COMMENT:
1300
      if ((lip->in_comment != NO_COMMENT) && lip->yyPeek() == '/')
1301
      {
1302
        /* Reject '*' '/' */
1303
        lip->yyUnget();
1304
        /* Accept '*' '/', with the proper echo */
1305
        lip->set_echo(lip->in_comment == PRESERVE_COMMENT);
1306
        lip->yySkipn(2);
1307
        /* And start recording the tokens again */
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1308
        lip->set_echo(true);
1 by brian
clean slate
1309
        lip->in_comment=NO_COMMENT;
1310
        state=MY_LEX_START;
1311
      }
1312
      else
1313
	state=MY_LEX_CHAR;		// Return '*'
1314
      break;
1315
    case MY_LEX_SET_VAR:		// Check if ':='
1316
      if (lip->yyPeek() != '=')
1317
      {
1318
	state=MY_LEX_CHAR;		// Return ':'
1319
	break;
1320
      }
1321
      lip->yySkip();
1322
      return (SET_VAR);
1323
    case MY_LEX_SEMICOLON:			// optional line terminator
1324
      if (lip->yyPeek())
1325
      {
177.1.5 by brian
Removed dead ? operator.
1326
        if ((thd->client_capabilities & CLIENT_MULTI_STATEMENTS))
1 by brian
clean slate
1327
        {
1328
          lip->found_semicolon= lip->get_ptr();
1329
          thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
1330
          lip->next_state= MY_LEX_END;
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1331
          lip->set_echo(true);
1 by brian
clean slate
1332
          return (END_OF_INPUT);
1333
        }
1334
        state= MY_LEX_CHAR;		// Return ';'
1335
	break;
1336
      }
1337
      lip->next_state=MY_LEX_END;       // Mark for next loop
1338
      return(END_OF_INPUT);
1339
    case MY_LEX_EOL:
1340
      if (lip->eof())
1341
      {
1342
        lip->yyUnget();                 // Reject the last '\0'
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1343
        lip->set_echo(false);
1 by brian
clean slate
1344
        lip->yySkip();
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1345
        lip->set_echo(true);
1 by brian
clean slate
1346
        /* Unbalanced comments with a missing '*' '/' are a syntax error */
1347
        if (lip->in_comment != NO_COMMENT)
1348
          return (ABORT_SYM);
1349
        lip->next_state=MY_LEX_END;     // Mark for next loop
1350
        return(END_OF_INPUT);
1351
      }
1352
      state=MY_LEX_CHAR;
1353
      break;
1354
    case MY_LEX_END:
1355
      lip->next_state=MY_LEX_END;
1356
      return(0);			// We found end of input last time
1357
      
1358
      /* Actually real shouldn't start with . but allow them anyhow */
1359
    case MY_LEX_REAL_OR_POINT:
1360
      if (my_isdigit(cs,lip->yyPeek()))
1361
	state = MY_LEX_REAL;		// Real
1362
      else
1363
      {
1364
	state= MY_LEX_IDENT_SEP;	// return '.'
1365
        lip->yyUnget();                 // Put back '.'
1366
      }
1367
      break;
1368
    case MY_LEX_USER_END:		// end '@' of user@hostname
1369
      switch (state_map[(uint8_t)lip->yyPeek()]) {
1370
      case MY_LEX_STRING:
1371
      case MY_LEX_USER_VARIABLE_DELIMITER:
1372
      case MY_LEX_STRING_OR_DELIMITER:
1373
	break;
1374
      case MY_LEX_USER_END:
1375
	lip->next_state=MY_LEX_SYSTEM_VAR;
1376
	break;
1377
      default:
1378
	lip->next_state=MY_LEX_HOSTNAME;
1379
	break;
1380
      }
1381
      yylval->lex_str.str=(char*) lip->get_ptr();
1382
      yylval->lex_str.length=1;
1383
      return((int) '@');
1384
    case MY_LEX_HOSTNAME:		// end '@' of user@hostname
1385
      for (c=lip->yyGet() ;
1386
	   my_isalnum(cs,c) || c == '.' || c == '_' ||  c == '$';
1387
           c= lip->yyGet()) ;
1388
      yylval->lex_str=get_token(lip, 0, lip->yyLength());
1389
      return(LEX_HOSTNAME);
1390
    case MY_LEX_SYSTEM_VAR:
1391
      yylval->lex_str.str=(char*) lip->get_ptr();
1392
      yylval->lex_str.length=1;
1393
      lip->yySkip();                                    // Skip '@'
1394
      lip->next_state= (state_map[(uint8_t)lip->yyPeek()] ==
1395
			MY_LEX_USER_VARIABLE_DELIMITER ?
1396
			MY_LEX_OPERATOR_OR_IDENT :
1397
			MY_LEX_IDENT_OR_KEYWORD);
1398
      return((int) '@');
1399
    case MY_LEX_IDENT_OR_KEYWORD:
1400
      /*
1401
	We come here when we have found two '@' in a row.
1402
	We should now be able to handle:
1403
	[(global | local | session) .]variable_name
1404
      */
1405
1406
      for (result_state= 0; ident_map[c= lip->yyGet()]; result_state|= c) {};
1407
      /* If there were non-ASCII characters, mark that we must convert */
1408
      result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
1409
1410
      if (c == '.')
1411
	lip->next_state=MY_LEX_IDENT_SEP;
1412
      length= lip->yyLength();
1413
      if (length == 0)
1414
        return(ABORT_SYM);              // Names must be nonempty.
1415
      if ((tokval= find_keyword(lip, length,0)))
1416
      {
1417
        lip->yyUnget();                         // Put back 'c'
1418
	return(tokval);				// Was keyword
1419
      }
1420
      yylval->lex_str=get_token(lip, 0, length);
1421
1422
      lip->body_utf8_append(lip->m_cpp_text_start);
1423
1424
      lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1425
                                    lip->m_cpp_text_end);
1426
1427
      return(result_state);
1428
    }
1429
  }
1430
}
1431
1432
1433
/**
1434
  Construct a copy of this object to be used for mysql_alter_table
1435
  and mysql_create_table.
1436
1437
  Historically, these two functions modify their Alter_info
1438
  arguments. This behaviour breaks re-execution of prepared
1439
  statements and stored procedures and is compensated by always
1440
  supplying a copy of Alter_info to these functions.
1441
1442
  @return You need to use check the error in THD for out
1443
  of memory condition after calling this function.
1444
*/
1445
1446
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1447
  :drop_list(rhs.drop_list, mem_root),
1448
  alter_list(rhs.alter_list, mem_root),
1449
  key_list(rhs.key_list, mem_root),
1450
  create_list(rhs.create_list, mem_root),
1451
  flags(rhs.flags),
1452
  keys_onoff(rhs.keys_onoff),
1453
  tablespace_op(rhs.tablespace_op),
1454
  no_parts(rhs.no_parts),
1455
  build_method(rhs.build_method),
1456
  datetime_field(rhs.datetime_field),
1457
  error_if_not_empty(rhs.error_if_not_empty)
1458
{
1459
  /*
1460
    Make deep copies of used objects.
1461
    This is not a fully deep copy - clone() implementations
1462
    of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1463
    do not copy string constants. At the same length the only
1464
    reason we make a copy currently is that ALTER/CREATE TABLE
1465
    code changes input Alter_info definitions, but string
1466
    constants never change.
1467
  */
1468
  list_copy_and_replace_each_value(drop_list, mem_root);
1469
  list_copy_and_replace_each_value(alter_list, mem_root);
1470
  list_copy_and_replace_each_value(key_list, mem_root);
1471
  list_copy_and_replace_each_value(create_list, mem_root);
1472
}
1473
1474
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
1475
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1 by brian
clean slate
1476
{
1477
  /*
1478
    TODO:
1479
    This code assumes that there are no multi-bytes characters
1480
    that can be considered white-space.
1481
  */
1482
1483
  while ((str->length > 0) && (my_isspace(cs, str->str[0])))
1484
  {
1485
    str->length --;
1486
    str->str ++;
1487
  }
1488
1489
  /*
1490
    FIXME:
1491
    Also, parsing backward is not safe with multi bytes characters
1492
  */
1493
  while ((str->length > 0) && (my_isspace(cs, str->str[str->length-1])))
1494
  {
1495
    str->length --;
1496
  }
1497
}
1498
1499
1500
/*
1501
  st_select_lex structures initialisations
1502
*/
1503
1504
void st_select_lex_node::init_query()
1505
{
1506
  options= 0;
1507
  linkage= UNSPECIFIED_TYPE;
1508
  no_error= no_table_names_allowed= 0;
1509
  uncacheable= 0;
1510
}
1511
1512
void st_select_lex_node::init_select()
1513
{
1514
}
1515
1516
void st_select_lex_unit::init_query()
1517
{
1518
  st_select_lex_node::init_query();
1519
  linkage= GLOBAL_OPTIONS_TYPE;
1520
  global_parameters= first_select();
1521
  select_limit_cnt= HA_POS_ERROR;
1522
  offset_limit_cnt= 0;
1523
  union_distinct= 0;
1524
  prepared= optimized= executed= 0;
1525
  item= 0;
1526
  union_result= 0;
1527
  table= 0;
1528
  fake_select_lex= 0;
1529
  cleaned= 0;
1530
  item_list.empty();
1531
  describe= 0;
1532
  found_rows_for_union= 0;
1533
}
1534
1535
void st_select_lex::init_query()
1536
{
1537
  st_select_lex_node::init_query();
1538
  table_list.empty();
1539
  top_join_list.empty();
1540
  join_list= &top_join_list;
1541
  embedding= leaf_tables= 0;
1542
  item_list.empty();
1543
  join= 0;
177.1.1 by brian
Removed dead code around prep.
1544
  having= where= 0;
1 by brian
clean slate
1545
  olap= UNSPECIFIED_OLAP_TYPE;
1546
  having_fix_field= 0;
1547
  context.select_lex= this;
1548
  context.init();
1549
  /*
1550
    Add the name resolution context of the current (sub)query to the
1551
    stack of contexts for the whole query.
1552
    TODO:
1553
    push_context may return an error if there is no memory for a new
1554
    element in the stack, however this method has no return value,
1555
    thus push_context should be moved to a place where query
1556
    initialization is checked for failure.
1557
  */
1558
  parent_lex->push_context(&context);
1559
  cond_count= between_count= with_wild= 0;
1560
  max_equal_elems= 0;
1561
  conds_processed_with_permanent_arena= 0;
1562
  ref_pointer_array= 0;
1563
  select_n_where_fields= 0;
1564
  select_n_having_items= 0;
1565
  subquery_in_having= explicit_limit= 0;
1566
  is_item_list_lookup= 0;
1567
  first_execution= 1;
1568
  first_cond_optimization= 1;
1569
  parsing_place= NO_MATTER;
177.1.2 by brian
Removed dead variable, sorted authors file.
1570
  exclude_from_table_unique_test= false;
1 by brian
clean slate
1571
  nest_level= 0;
1572
  link_next= 0;
1573
}
1574
1575
void st_select_lex::init_select()
1576
{
1577
  st_select_lex_node::init_select();
1578
  sj_nests.empty();
1579
  group_list.empty();
1580
  type= db= 0;
1581
  having= 0;
1582
  table_join_options= 0;
1583
  in_sum_expr= with_wild= 0;
1584
  options= 0;
1585
  braces= 0;
1586
  interval_list.empty();
1587
  ftfunc_list_alloc.empty();
1588
  inner_sum_func_list= 0;
1589
  ftfunc_list= &ftfunc_list_alloc;
1590
  linkage= UNSPECIFIED_TYPE;
1591
  order_list.elements= 0;
1592
  order_list.first= 0;
1593
  order_list.next= (uchar**) &order_list.first;
1594
  /* Set limit and offset to default values */
1595
  select_limit= 0;      /* denotes the default limit = HA_POS_ERROR */
1596
  offset_limit= 0;      /* denotes the default offset = 0 */
1597
  with_sum_func= 0;
1598
  is_correlated= 0;
1599
  cur_pos_in_select_list= UNDEF_POS;
1600
  non_agg_fields.empty();
1601
  cond_value= having_value= Item::COND_UNDEF;
1602
  inner_refs_list.empty();
1603
  full_group_by_flag= 0;
1604
}
1605
1606
/*
1607
  st_select_lex structures linking
1608
*/
1609
1610
/* include on level down */
1611
void st_select_lex_node::include_down(st_select_lex_node *upper)
1612
{
1613
  if ((next= upper->slave))
1614
    next->prev= &next;
1615
  prev= &upper->slave;
1616
  upper->slave= this;
1617
  master= upper;
1618
  slave= 0;
1619
}
1620
1621
/*
1622
  include on level down (but do not link)
1623
1624
  SYNOPSYS
1625
    st_select_lex_node::include_standalone()
1626
    upper - reference on node underr which this node should be included
1627
    ref - references on reference on this node
1628
*/
1629
void st_select_lex_node::include_standalone(st_select_lex_node *upper,
1630
					    st_select_lex_node **ref)
1631
{
1632
  next= 0;
1633
  prev= ref;
1634
  master= upper;
1635
  slave= 0;
1636
}
1637
1638
/* include neighbour (on same level) */
1639
void st_select_lex_node::include_neighbour(st_select_lex_node *before)
1640
{
1641
  if ((next= before->next))
1642
    next->prev= &next;
1643
  prev= &before->next;
1644
  before->next= this;
1645
  master= before->master;
1646
  slave= 0;
1647
}
1648
1649
/* including in global SELECT_LEX list */
1650
void st_select_lex_node::include_global(st_select_lex_node **plink)
1651
{
1652
  if ((link_next= *plink))
1653
    link_next->link_prev= &link_next;
1654
  link_prev= plink;
1655
  *plink= this;
1656
}
1657
1658
//excluding from global list (internal function)
1659
void st_select_lex_node::fast_exclude()
1660
{
1661
  if (link_prev)
1662
  {
1663
    if ((*link_prev= link_next))
1664
      link_next->link_prev= link_prev;
1665
  }
1666
  // Remove slave structure
1667
  for (; slave; slave= slave->next)
1668
    slave->fast_exclude();
1669
  
1670
}
1671
1672
/*
1673
  excluding select_lex structure (except first (first select can't be
1674
  deleted, because it is most upper select))
1675
*/
1676
void st_select_lex_node::exclude()
1677
{
1678
  //exclude from global list
1679
  fast_exclude();
1680
  //exclude from other structures
1681
  if ((*prev= next))
1682
    next->prev= prev;
1683
  /* 
1684
     We do not need following statements, because prev pointer of first 
1685
     list element point to master->slave
1686
     if (master->slave == this)
1687
       master->slave= next;
1688
  */
1689
}
1690
1691
1692
/*
1693
  Exclude level of current unit from tree of SELECTs
1694
1695
  SYNOPSYS
1696
    st_select_lex_unit::exclude_level()
1697
1698
  NOTE: units which belong to current will be brought up on level of
1699
  currernt unit 
1700
*/
1701
void st_select_lex_unit::exclude_level()
1702
{
1703
  SELECT_LEX_UNIT *units= 0, **units_last= &units;
1704
  for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1705
  {
1706
    // unlink current level from global SELECTs list
1707
    if (sl->link_prev && (*sl->link_prev= sl->link_next))
1708
      sl->link_next->link_prev= sl->link_prev;
1709
1710
    // bring up underlay levels
1711
    SELECT_LEX_UNIT **last= 0;
1712
    for (SELECT_LEX_UNIT *u= sl->first_inner_unit(); u; u= u->next_unit())
1713
    {
1714
      u->master= master;
1715
      last= (SELECT_LEX_UNIT**)&(u->next);
1716
    }
1717
    if (last)
1718
    {
1719
      (*units_last)= sl->first_inner_unit();
1720
      units_last= last;
1721
    }
1722
  }
1723
  if (units)
1724
  {
1725
    // include brought up levels in place of current
1726
    (*prev)= units;
1727
    (*units_last)= (SELECT_LEX_UNIT*)next;
1728
    if (next)
1729
      next->prev= (SELECT_LEX_NODE**)units_last;
1730
    units->prev= prev;
1731
  }
1732
  else
1733
  {
1734
    // exclude currect unit from list of nodes
1735
    (*prev)= next;
1736
    if (next)
1737
      next->prev= prev;
1738
  }
1739
}
1740
1741
1742
/*
1743
  Exclude subtree of current unit from tree of SELECTs
1744
1745
  SYNOPSYS
1746
    st_select_lex_unit::exclude_tree()
1747
*/
1748
void st_select_lex_unit::exclude_tree()
1749
{
1750
  for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1751
  {
1752
    // unlink current level from global SELECTs list
1753
    if (sl->link_prev && (*sl->link_prev= sl->link_next))
1754
      sl->link_next->link_prev= sl->link_prev;
1755
1756
    // unlink underlay levels
1757
    for (SELECT_LEX_UNIT *u= sl->first_inner_unit(); u; u= u->next_unit())
1758
    {
1759
      u->exclude_level();
1760
    }
1761
  }
1762
  // exclude currect unit from list of nodes
1763
  (*prev)= next;
1764
  if (next)
1765
    next->prev= prev;
1766
}
1767
1768
1769
/*
1770
  st_select_lex_node::mark_as_dependent mark all st_select_lex struct from 
1771
  this to 'last' as dependent
1772
1773
  SYNOPSIS
1774
    last - pointer to last st_select_lex struct, before wich all 
1775
           st_select_lex have to be marked as dependent
1776
1777
  NOTE
1778
    'last' should be reachable from this st_select_lex_node
1779
*/
1780
1781
void st_select_lex::mark_as_dependent(st_select_lex *last)
1782
{
1783
  /*
1784
    Mark all selects from resolved to 1 before select where was
1785
    found table as depended (of select where was found table)
1786
  */
1787
  for (SELECT_LEX *s= this;
1788
       s && s != last;
1789
       s= s->outer_select())
1790
  {
1791
    if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1792
    {
1793
      // Select is dependent of outer select
1794
      s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1795
                       UNCACHEABLE_DEPENDENT;
1796
      SELECT_LEX_UNIT *munit= s->master_unit();
1797
      munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1798
                       UNCACHEABLE_DEPENDENT;
1799
      for (SELECT_LEX *sl= munit->first_select(); sl ; sl= sl->next_select())
1800
      {
1801
        if (sl != s &&
1802
            !(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1803
          sl->uncacheable|= UNCACHEABLE_UNITED;
1804
      }
1805
    }
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1806
    s->is_correlated= true;
1 by brian
clean slate
1807
    Item_subselect *subquery_predicate= s->master_unit()->item;
1808
    if (subquery_predicate)
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1809
      subquery_predicate->is_correlated= true;
1 by brian
clean slate
1810
  }
1811
}
1812
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1813
bool st_select_lex_node::set_braces(bool value __attribute__((unused)))
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1814
{ return 1; }
1 by brian
clean slate
1815
bool st_select_lex_node::inc_in_sum_expr()           { return 1; }
1816
uint st_select_lex_node::get_in_sum_expr()           { return 0; }
327.2.4 by Brian Aker
Refactoring table.h
1817
TableList* st_select_lex_node::get_table_list()     { return 0; }
1 by brian
clean slate
1818
List<Item>* st_select_lex_node::get_item_list()      { return 0; }
327.2.4 by Brian Aker
Refactoring table.h
1819
TableList *st_select_lex_node::add_table_to_list (THD *thd __attribute__((unused)),
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1820
                                                   Table_ident *table __attribute__((unused)),
1821
						  LEX_STRING *alias __attribute__((unused)),
1822
						  uint32_t table_join_options __attribute__((unused)),
1823
						  thr_lock_type flags __attribute__((unused)),
1824
						  List<Index_hint> *hints __attribute__((unused)),
1825
                                                  LEX_STRING *option __attribute__((unused)))
1 by brian
clean slate
1826
{
1827
  return 0;
1828
}
202 by Brian Aker
Cleanup sql_lex to modern types.
1829
uint32_t st_select_lex_node::get_table_join_options()
1 by brian
clean slate
1830
{
1831
  return 0;
1832
}
1833
1834
/*
1835
  prohibit using LIMIT clause
1836
*/
1837
bool st_select_lex::test_limit()
1838
{
1839
  if (select_limit != 0)
1840
  {
1841
    my_error(ER_NOT_SUPPORTED_YET, MYF(0),
1842
             "LIMIT & IN/ALL/ANY/SOME subquery");
1843
    return(1);
1844
  }
1845
  return(0);
1846
}
1847
1848
1849
st_select_lex_unit* st_select_lex_unit::master_unit()
1850
{
1851
    return this;
1852
}
1853
1854
1855
st_select_lex* st_select_lex_unit::outer_select()
1856
{
1857
  return (st_select_lex*) master;
1858
}
1859
1860
1861
bool st_select_lex::add_order_to_list(THD *thd, Item *item, bool asc)
1862
{
1863
  return add_to_list(thd, order_list, item, asc);
1864
}
1865
1866
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
1867
bool st_select_lex::add_item_to_list(THD *thd __attribute__((unused)),
77.1.15 by Monty Taylor
Bunch of warning cleanups.
1868
                                     Item *item)
1 by brian
clean slate
1869
{
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1870
  return(item_list.push_back(item));
1 by brian
clean slate
1871
}
1872
1873
1874
bool st_select_lex::add_group_to_list(THD *thd, Item *item, bool asc)
1875
{
1876
  return add_to_list(thd, group_list, item, asc);
1877
}
1878
1879
1880
st_select_lex_unit* st_select_lex::master_unit()
1881
{
1882
  return (st_select_lex_unit*) master;
1883
}
1884
1885
1886
st_select_lex* st_select_lex::outer_select()
1887
{
1888
  return (st_select_lex*) master->get_master();
1889
}
1890
1891
1892
bool st_select_lex::set_braces(bool value)
1893
{
1894
  braces= value;
1895
  return 0; 
1896
}
1897
1898
1899
bool st_select_lex::inc_in_sum_expr()
1900
{
1901
  in_sum_expr++;
1902
  return 0;
1903
}
1904
1905
1906
uint st_select_lex::get_in_sum_expr()
1907
{
1908
  return in_sum_expr;
1909
}
1910
1911
327.2.4 by Brian Aker
Refactoring table.h
1912
TableList* st_select_lex::get_table_list()
1 by brian
clean slate
1913
{
327.2.4 by Brian Aker
Refactoring table.h
1914
  return (TableList*) table_list.first;
1 by brian
clean slate
1915
}
1916
1917
List<Item>* st_select_lex::get_item_list()
1918
{
1919
  return &item_list;
1920
}
1921
202 by Brian Aker
Cleanup sql_lex to modern types.
1922
uint32_t st_select_lex::get_table_join_options()
1 by brian
clean slate
1923
{
1924
  return table_join_options;
1925
}
1926
1927
1928
bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
1929
{
1930
  if (ref_pointer_array)
1931
    return 0;
1932
1933
  /*
1934
    We have to create array in prepared statement memory if it is
1935
    prepared statement
1936
  */
1937
  Query_arena *arena= thd->stmt_arena;
1938
  return (ref_pointer_array=
1939
          (Item **)arena->alloc(sizeof(Item*) * (n_child_sum_items +
1940
                                                 item_list.elements +
1941
                                                 select_n_having_items +
1942
                                                 select_n_where_fields +
1943
                                                 order_group_num)*5)) == 0;
1944
}
1945
1946
1947
void st_select_lex_unit::print(String *str, enum_query_type query_type)
1948
{
1949
  bool union_all= !union_distinct;
1950
  for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1951
  {
1952
    if (sl != first_select())
1953
    {
1954
      str->append(STRING_WITH_LEN(" union "));
1955
      if (union_all)
1956
	str->append(STRING_WITH_LEN("all "));
1957
      else if (union_distinct == sl)
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
1958
        union_all= true;
1 by brian
clean slate
1959
    }
1960
    if (sl->braces)
1961
      str->append('(');
1962
    sl->print(thd, str, query_type);
1963
    if (sl->braces)
1964
      str->append(')');
1965
  }
1966
  if (fake_select_lex == global_parameters)
1967
  {
1968
    if (fake_select_lex->order_list.elements)
1969
    {
1970
      str->append(STRING_WITH_LEN(" order by "));
1971
      fake_select_lex->print_order(
1972
        str,
327.2.3 by Brian Aker
Refactoring of class Table
1973
        (order_st *) fake_select_lex->order_list.first,
1 by brian
clean slate
1974
        query_type);
1975
    }
1976
    fake_select_lex->print_limit(thd, str, query_type);
1977
  }
1978
}
1979
1980
1981
void st_select_lex::print_order(String *str,
327.2.3 by Brian Aker
Refactoring of class Table
1982
                                order_st *order,
1 by brian
clean slate
1983
                                enum_query_type query_type)
1984
{
1985
  for (; order; order= order->next)
1986
  {
1987
    if (order->counter_used)
1988
    {
1989
      char buffer[20];
77.1.18 by Monty Taylor
Removed my_vsnprintf and my_snprintf.
1990
      uint length= snprintf(buffer, 20, "%d", order->counter);
1 by brian
clean slate
1991
      str->append(buffer, length);
1992
    }
1993
    else
1994
      (*order->item)->print(str, query_type);
1995
    if (!order->asc)
1996
      str->append(STRING_WITH_LEN(" desc"));
1997
    if (order->next)
1998
      str->append(',');
1999
  }
2000
}
2001
 
2002
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
2003
void st_select_lex::print_limit(THD *thd __attribute__((unused)),
1 by brian
clean slate
2004
                                String *str,
2005
                                enum_query_type query_type)
2006
{
2007
  SELECT_LEX_UNIT *unit= master_unit();
2008
  Item_subselect *item= unit->item;
2009
2010
  if (item && unit->global_parameters == this)
2011
  {
2012
    Item_subselect::subs_type subs_type= item->substype();
2013
    if (subs_type == Item_subselect::EXISTS_SUBS ||
2014
        subs_type == Item_subselect::IN_SUBS ||
2015
        subs_type == Item_subselect::ALL_SUBS)
2016
    {
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2017
      assert(!item->fixed ||
1 by brian
clean slate
2018
                  /*
2019
                    If not using materialization both:
2020
                    select_limit == 1, and there should be no offset_limit.
2021
                  */
2022
                  (((subs_type == Item_subselect::IN_SUBS) &&
2023
                    ((Item_in_subselect*)item)->exec_method ==
2024
                    Item_in_subselect::MATERIALIZATION) ?
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2025
                   true :
80.1.1 by Brian Aker
LL() cleanup
2026
                   (select_limit->val_int() == 1LL) &&
1 by brian
clean slate
2027
                   offset_limit == 0));
2028
      return;
2029
    }
2030
  }
2031
  if (explicit_limit)
2032
  {
2033
    str->append(STRING_WITH_LEN(" limit "));
2034
    if (offset_limit)
2035
    {
2036
      offset_limit->print(str, query_type);
2037
      str->append(',');
2038
    }
2039
    select_limit->print(str, query_type);
2040
  }
2041
}
2042
2043
/**
2044
  @brief Restore the LEX and THD in case of a parse error.
2045
2046
  This is a clean up call that is invoked by the Bison generated
2047
  parser before returning an error from MYSQLparse. If your
2048
  semantic actions manipulate with the global thread state (which
2049
  is a very bad practice and should not normally be employed) and
2050
  need a clean-up in case of error, and you can not use %destructor
2051
  rule in the grammar file itself, this function should be used
2052
  to implement the clean up.
2053
*/
2054
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
2055
void st_lex::cleanup_lex_after_parse_error(THD *thd __attribute__((unused)))
1 by brian
clean slate
2056
{
2057
}
2058
2059
/*
2060
  Initialize (or reset) Query_tables_list object.
2061
2062
  SYNOPSIS
2063
    reset_query_tables_list()
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2064
      init  true  - we should perform full initialization of object with
1 by brian
clean slate
2065
                    allocating needed memory
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2066
            false - object is already initialized so we should only reset
1 by brian
clean slate
2067
                    its state so it can be used for parsing/processing
2068
                    of new statement
2069
2070
  DESCRIPTION
2071
    This method initializes Query_tables_list so it can be used as part
2072
    of LEX object for parsing/processing of statement. One can also use
2073
    this method to reset state of already initialized Query_tables_list
2074
    so it can be used for processing of new statement.
2075
*/
2076
2077
void Query_tables_list::reset_query_tables_list(bool init)
2078
{
2079
  if (!init && query_tables)
2080
  {
327.2.4 by Brian Aker
Refactoring table.h
2081
    TableList *table= query_tables;
1 by brian
clean slate
2082
    for (;;)
2083
    {
2084
      if (query_tables_last == &table->next_global ||
2085
          !(table= table->next_global))
2086
        break;
2087
    }
2088
  }
2089
  query_tables= 0;
2090
  query_tables_last= &query_tables;
2091
  query_tables_own_last= 0;
2092
  if (init)
2093
  {
2094
    /*
2095
      We delay real initialization of hash (and therefore related
2096
      memory allocation) until first insertion into this hash.
2097
    */
2098
    hash_clear(&sroutines);
2099
  }
2100
  else if (sroutines.records)
2101
  {
2102
    /* Non-zero sroutines.records means that hash was initialized. */
2103
    my_hash_reset(&sroutines);
2104
  }
2105
  sroutines_list.empty();
2106
  sroutines_list_own_last= sroutines_list.next;
2107
  sroutines_list_own_elements= 0;
2108
  binlog_stmt_flags= 0;
2109
}
2110
2111
2112
/*
2113
  Destroy Query_tables_list object with freeing all resources used by it.
2114
2115
  SYNOPSIS
2116
    destroy_query_tables_list()
2117
*/
2118
2119
void Query_tables_list::destroy_query_tables_list()
2120
{
2121
  hash_free(&sroutines);
2122
}
2123
2124
2125
/*
2126
  Initialize LEX object.
2127
2128
  SYNOPSIS
2129
    st_lex::st_lex()
2130
2131
  NOTE
2132
    LEX object initialized with this constructor can be used as part of
2133
    THD object for which one can safely call open_tables(), lock_tables()
2134
    and close_thread_tables() functions. But it is not yet ready for
2135
    statement parsing. On should use lex_start() function to prepare LEX
2136
    for this.
2137
*/
2138
2139
st_lex::st_lex()
2140
  :result(0), yacc_yyss(0), yacc_yyvs(0),
2141
   sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
2142
{
2143
2144
  my_init_dynamic_array2(&plugins, sizeof(plugin_ref),
2145
                         plugins_static_buffer,
2146
                         INITIAL_LEX_PLUGIN_LIST_SIZE, 
2147
                         INITIAL_LEX_PLUGIN_LIST_SIZE);
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2148
  reset_query_tables_list(true);
1 by brian
clean slate
2149
}
2150
2151
2152
/*
2153
  Check whether the merging algorithm can be used on this VIEW
2154
2155
  SYNOPSIS
2156
    st_lex::can_be_merged()
2157
2158
  DESCRIPTION
2159
    We can apply merge algorithm if it is single SELECT view  with
2160
    subqueries only in WHERE clause (we do not count SELECTs of underlying
2161
    views, and second level subqueries) and we have not grpouping, ordering,
2162
    HAVING clause, aggregate functions, DISTINCT clause, LIMIT clause and
2163
    several underlying tables.
2164
2165
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2166
    false - only temporary table algorithm can be used
2167
    true  - merge algorithm can be used
1 by brian
clean slate
2168
*/
2169
2170
bool st_lex::can_be_merged()
2171
{
2172
  // TODO: do not forget implement case when select_lex.table_list.elements==0
2173
2174
  /* find non VIEW subqueries/unions */
2175
  bool selects_allow_merge= select_lex.next_select() == 0;
2176
  if (selects_allow_merge)
2177
  {
2178
    for (SELECT_LEX_UNIT *tmp_unit= select_lex.first_inner_unit();
2179
         tmp_unit;
2180
         tmp_unit= tmp_unit->next_unit())
2181
    {
2182
      if (tmp_unit->first_select()->parent_lex == this &&
2183
          (tmp_unit->item == 0 ||
2184
           (tmp_unit->item->place() != IN_WHERE &&
2185
            tmp_unit->item->place() != IN_ON)))
2186
      {
2187
        selects_allow_merge= 0;
2188
        break;
2189
      }
2190
    }
2191
  }
2192
2193
  return (selects_allow_merge &&
2194
	  select_lex.group_list.elements == 0 &&
2195
	  select_lex.having == 0 &&
2196
          select_lex.with_sum_func == 0 &&
2197
	  select_lex.table_list.elements >= 1 &&
2198
	  !(select_lex.options & SELECT_DISTINCT) &&
2199
          select_lex.select_limit == 0);
2200
}
2201
2202
2203
/*
2204
  check if command can use VIEW with MERGE algorithm (for top VIEWs)
2205
2206
  SYNOPSIS
2207
    st_lex::can_use_merged()
2208
2209
  DESCRIPTION
2210
    Only listed here commands can use merge algorithm in top level
2211
    SELECT_LEX (for subqueries will be used merge algorithm if
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2212
    st_lex::can_not_use_merged() is not true).
1 by brian
clean slate
2213
2214
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2215
    false - command can't use merged VIEWs
2216
    true  - VIEWs with MERGE algorithms can be used
1 by brian
clean slate
2217
*/
2218
2219
bool st_lex::can_use_merged()
2220
{
2221
  switch (sql_command)
2222
  {
2223
  case SQLCOM_SELECT:
2224
  case SQLCOM_CREATE_TABLE:
2225
  case SQLCOM_UPDATE:
2226
  case SQLCOM_UPDATE_MULTI:
2227
  case SQLCOM_DELETE:
2228
  case SQLCOM_DELETE_MULTI:
2229
  case SQLCOM_INSERT:
2230
  case SQLCOM_INSERT_SELECT:
2231
  case SQLCOM_REPLACE:
2232
  case SQLCOM_REPLACE_SELECT:
2233
  case SQLCOM_LOAD:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2234
    return true;
1 by brian
clean slate
2235
  default:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2236
    return false;
1 by brian
clean slate
2237
  }
2238
}
2239
2240
/*
2241
  Check if command can't use merged views in any part of command
2242
2243
  SYNOPSIS
2244
    st_lex::can_not_use_merged()
2245
2246
  DESCRIPTION
2247
    Temporary table algorithm will be used on all SELECT levels for queries
2248
    listed here (see also st_lex::can_use_merged()).
2249
2250
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2251
    false - command can't use merged VIEWs
2252
    true  - VIEWs with MERGE algorithms can be used
1 by brian
clean slate
2253
*/
2254
2255
bool st_lex::can_not_use_merged()
2256
{
2257
  switch (sql_command)
2258
  {
2259
  /*
2260
    SQLCOM_SHOW_FIELDS is necessary to make 
2261
    information schema tables working correctly with views.
2262
    see get_schema_tables_result function
2263
  */
2264
  case SQLCOM_SHOW_FIELDS:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2265
    return true;
1 by brian
clean slate
2266
  default:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2267
    return false;
1 by brian
clean slate
2268
  }
2269
}
2270
2271
/*
2272
  Detect that we need only table structure of derived table/view
2273
2274
  SYNOPSIS
2275
    only_view_structure()
2276
2277
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2278
    true yes, we need only structure
2279
    false no, we need data
1 by brian
clean slate
2280
*/
2281
2282
bool st_lex::only_view_structure()
2283
{
2284
  switch (sql_command) {
2285
  case SQLCOM_SHOW_CREATE:
2286
  case SQLCOM_SHOW_TABLES:
2287
  case SQLCOM_SHOW_FIELDS:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2288
    return true;
1 by brian
clean slate
2289
  default:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2290
    return false;
1 by brian
clean slate
2291
  }
2292
}
2293
2294
2295
/*
2296
  Should Items_ident be printed correctly
2297
2298
  SYNOPSIS
2299
    need_correct_ident()
2300
2301
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2302
    true yes, we need only structure
2303
    false no, we need data
1 by brian
clean slate
2304
*/
2305
2306
2307
bool st_lex::need_correct_ident()
2308
{
2309
  switch(sql_command)
2310
  {
2311
  case SQLCOM_SHOW_CREATE:
2312
  case SQLCOM_SHOW_TABLES:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2313
    return true;
1 by brian
clean slate
2314
  default:
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2315
    return false;
1 by brian
clean slate
2316
  }
2317
}
2318
2319
2320
/**
2321
  This method should be called only during parsing.
2322
  It is aware of compound statements (stored routine bodies)
2323
  and will initialize the destination with the default
2324
  database of the stored routine, rather than the default
2325
  database of the connection it is parsed in.
2326
  E.g. if one has no current database selected, or current database 
2327
  set to 'bar' and then issues:
2328
2329
  CREATE PROCEDURE foo.p1() BEGIN SELECT * FROM t1 END//
2330
2331
  t1 is meant to refer to foo.t1, not to bar.t1.
2332
2333
  This method is needed to support this rule.
2334
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2335
  @return true in case of error (parsing should be aborted, false in
1 by brian
clean slate
2336
  case of success
2337
*/
2338
2339
bool
2340
st_lex::copy_db_to(char **p_db, size_t *p_db_length) const
2341
{
2342
  return thd->copy_db_to(p_db, p_db_length);
2343
}
2344
2345
/*
2346
  initialize limit counters
2347
2348
  SYNOPSIS
2349
    st_select_lex_unit::set_limit()
2350
    values	- SELECT_LEX with initial values for counters
2351
*/
2352
2353
void st_select_lex_unit::set_limit(st_select_lex *sl)
2354
{
2355
  ha_rows select_limit_val;
151 by Brian Aker
Ulonglong to uint64_t
2356
  uint64_t val;
1 by brian
clean slate
2357
2358
  val= sl->select_limit ? sl->select_limit->val_uint() : HA_POS_ERROR;
2359
  select_limit_val= (ha_rows)val;
2360
#ifndef BIG_TABLES
2361
  /* 
151 by Brian Aker
Ulonglong to uint64_t
2362
    Check for overflow : ha_rows can be smaller then uint64_t if
1 by brian
clean slate
2363
    BIG_TABLES is off.
2364
    */
151 by Brian Aker
Ulonglong to uint64_t
2365
  if (val != (uint64_t)select_limit_val)
1 by brian
clean slate
2366
    select_limit_val= HA_POS_ERROR;
2367
#endif
2368
  offset_limit_cnt= (ha_rows)(sl->offset_limit ? sl->offset_limit->val_uint() :
80.1.1 by Brian Aker
LL() cleanup
2369
                                                 0ULL);
1 by brian
clean slate
2370
  select_limit_cnt= select_limit_val + offset_limit_cnt;
2371
  if (select_limit_cnt < select_limit_val)
2372
    select_limit_cnt= HA_POS_ERROR;		// no limit
2373
}
2374
2375
2376
/*
2377
  Unlink the first table from the global table list and the first table from
2378
  outer select (lex->select_lex) local list
2379
2380
  SYNOPSIS
2381
    unlink_first_table()
2382
    link_to_local	Set to 1 if caller should link this table to local list
2383
2384
  NOTES
2385
    We assume that first tables in both lists is the same table or the local
2386
    list is empty.
2387
2388
  RETURN
2389
    0	If 'query_tables' == 0
2390
    unlinked table
2391
      In this case link_to_local is set.
2392
2393
*/
327.2.4 by Brian Aker
Refactoring table.h
2394
TableList *st_lex::unlink_first_table(bool *link_to_local)
1 by brian
clean slate
2395
{
327.2.4 by Brian Aker
Refactoring table.h
2396
  TableList *first;
1 by brian
clean slate
2397
  if ((first= query_tables))
2398
  {
2399
    /*
2400
      Exclude from global table list
2401
    */
2402
    if ((query_tables= query_tables->next_global))
2403
      query_tables->prev_global= &query_tables;
2404
    else
2405
      query_tables_last= &query_tables;
2406
    first->next_global= 0;
2407
2408
    /*
2409
      and from local list if it is not empty
2410
    */
2411
    if ((*link_to_local= test(select_lex.table_list.first)))
2412
    {
2413
      select_lex.context.table_list= 
2414
        select_lex.context.first_name_resolution_table= first->next_local;
2415
      select_lex.table_list.first= (uchar*) (first->next_local);
2416
      select_lex.table_list.elements--;	//safety
2417
      first->next_local= 0;
2418
      /*
2419
        Ensure that the global list has the same first table as the local
2420
        list.
2421
      */
2422
      first_lists_tables_same();
2423
    }
2424
  }
2425
  return first;
2426
}
2427
2428
2429
/*
2430
  Bring first local table of first most outer select to first place in global
2431
  table list
2432
2433
  SYNOPSYS
2434
     st_lex::first_lists_tables_same()
2435
2436
  NOTES
2437
    In many cases (for example, usual INSERT/DELETE/...) the first table of
2438
    main SELECT_LEX have special meaning => check that it is the first table
2439
    in global list and re-link to be first in the global list if it is
2440
    necessary.  We need such re-linking only for queries with sub-queries in
2441
    the select list, as only in this case tables of sub-queries will go to
2442
    the global list first.
2443
*/
2444
2445
void st_lex::first_lists_tables_same()
2446
{
327.2.4 by Brian Aker
Refactoring table.h
2447
  TableList *first_table= (TableList*) select_lex.table_list.first;
1 by brian
clean slate
2448
  if (query_tables != first_table && first_table != 0)
2449
  {
327.2.4 by Brian Aker
Refactoring table.h
2450
    TableList *next;
1 by brian
clean slate
2451
    if (query_tables_last == &first_table->next_global)
2452
      query_tables_last= first_table->prev_global;
2453
2454
    if ((next= *first_table->prev_global= first_table->next_global))
2455
      next->prev_global= first_table->prev_global;
2456
    /* include in new place */
2457
    first_table->next_global= query_tables;
2458
    /*
2459
       We are sure that query_tables is not 0, because first_table was not
2460
       first table in the global list => we can use
2461
       query_tables->prev_global without check of query_tables
2462
    */
2463
    query_tables->prev_global= &first_table->next_global;
2464
    first_table->prev_global= &query_tables;
2465
    query_tables= first_table;
2466
  }
2467
}
2468
2469
2470
/*
2471
  Link table back that was unlinked with unlink_first_table()
2472
2473
  SYNOPSIS
2474
    link_first_table_back()
2475
    link_to_local	do we need link this table to local
2476
2477
  RETURN
2478
    global list
2479
*/
2480
327.2.4 by Brian Aker
Refactoring table.h
2481
void st_lex::link_first_table_back(TableList *first,
1 by brian
clean slate
2482
				   bool link_to_local)
2483
{
2484
  if (first)
2485
  {
2486
    if ((first->next_global= query_tables))
2487
      query_tables->prev_global= &first->next_global;
2488
    else
2489
      query_tables_last= &first->next_global;
2490
    query_tables= first;
2491
2492
    if (link_to_local)
2493
    {
327.2.4 by Brian Aker
Refactoring table.h
2494
      first->next_local= (TableList*) select_lex.table_list.first;
1 by brian
clean slate
2495
      select_lex.context.table_list= first;
2496
      select_lex.table_list.first= (uchar*) first;
2497
      select_lex.table_list.elements++;	//safety
2498
    }
2499
  }
2500
}
2501
2502
2503
2504
/*
2505
  cleanup lex for case when we open table by table for processing
2506
2507
  SYNOPSIS
2508
    st_lex::cleanup_after_one_table_open()
2509
2510
  NOTE
2511
    This method is mostly responsible for cleaning up of selects lists and
2512
    derived tables state. To rollback changes in Query_tables_list one has
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2513
    to call Query_tables_list::reset_query_tables_list(false).
1 by brian
clean slate
2514
*/
2515
2516
void st_lex::cleanup_after_one_table_open()
2517
{
2518
  /*
2519
    thd->lex->derived_tables & additional units may be set if we open
2520
    a view. It is necessary to clear thd->lex->derived_tables flag
2521
    to prevent processing of derived tables during next open_and_lock_tables
2522
    if next table is a real table and cleanup & remove underlying units
2523
    NOTE: all units will be connected to thd->lex->select_lex, because we
2524
    have not UNION on most upper level.
2525
    */
2526
  if (all_selects_list != &select_lex)
2527
  {
2528
    derived_tables= 0;
2529
    /* cleunup underlying units (units of VIEW) */
2530
    for (SELECT_LEX_UNIT *un= select_lex.first_inner_unit();
2531
         un;
2532
         un= un->next_unit())
2533
      un->cleanup();
2534
    /* reduce all selects list to default state */
2535
    all_selects_list= &select_lex;
2536
    /* remove underlying units (units of VIEW) subtree */
2537
    select_lex.cut_subtree();
2538
  }
2539
}
2540
2541
2542
/*
2543
  Save current state of Query_tables_list for this LEX, and prepare it
2544
  for processing of new statemnt.
2545
2546
  SYNOPSIS
2547
    reset_n_backup_query_tables_list()
2548
      backup  Pointer to Query_tables_list instance to be used for backup
2549
*/
2550
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
2551
void st_lex::reset_n_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
1 by brian
clean slate
2552
{
2553
}
2554
2555
2556
/*
2557
  Restore state of Query_tables_list for this LEX from backup.
2558
2559
  SYNOPSIS
2560
    restore_backup_query_tables_list()
2561
      backup  Pointer to Query_tables_list instance used for backup
2562
*/
2563
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
2564
void st_lex::restore_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
1 by brian
clean slate
2565
{
2566
}
2567
2568
2569
/*
2570
  Checks for usage of routines and/or tables in a parsed statement
2571
2572
  SYNOPSIS
2573
    st_lex:table_or_sp_used()
2574
2575
  RETURN
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2576
    false  No routines and tables used
2577
    true   Either or both routines and tables are used.
1 by brian
clean slate
2578
*/
2579
2580
bool st_lex::table_or_sp_used()
2581
{
2582
  if (sroutines.records || query_tables)
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2583
    return(true);
1 by brian
clean slate
2584
51.1.52 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
2585
  return(false);
1 by brian
clean slate
2586
}
2587
2588
2589
/*
2590
  Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
2591
2592
  SYNOPSIS
2593
    fix_prepare_info_in_table_list()
2594
      thd  Thread handle
2595
      tbl  List of tables to process
2596
2597
  DESCRIPTION
2598
    Perform end-end-of prepare fixup for list of tables, if any of the tables
2599
    is a merge-algorithm VIEW, recursively fix up its underlying tables as
2600
    well.
2601
2602
*/
2603
327.2.4 by Brian Aker
Refactoring table.h
2604
static void fix_prepare_info_in_table_list(THD *thd, TableList *tbl)
1 by brian
clean slate
2605
{
2606
  for (; tbl; tbl= tbl->next_local)
2607
  {
2608
    if (tbl->on_expr)
2609
    {
2610
      tbl->prep_on_expr= tbl->on_expr;
2611
      tbl->on_expr= tbl->on_expr->copy_andor_structure(thd);
2612
    }
2613
    fix_prepare_info_in_table_list(thd, tbl->merge_underlying_list);
2614
  }
2615
}
2616
2617
2618
/*
2619
  There are st_select_lex::add_table_to_list &
2620
  st_select_lex::set_lock_for_tables are in sql_parse.cc
2621
2622
  st_select_lex::print is in sql_select.cc
2623
2624
  st_select_lex_unit::prepare, st_select_lex_unit::exec,
2625
  st_select_lex_unit::cleanup, st_select_lex_unit::reinit_exec_mechanism,
2626
  st_select_lex_unit::change_result
2627
  are in sql_union.cc
2628
*/
2629
2630
/*
2631
  Sets the kind of hints to be added by the calls to add_index_hint().
2632
2633
  SYNOPSIS
2634
    set_index_hint_type()
2635
      type_arg     The kind of hints to be added from now on.
2636
      clause       The clause to use for hints to be added from now on.
2637
2638
  DESCRIPTION
2639
    Used in filling up the tagged hints list.
2640
    This list is filled by first setting the kind of the hint as a 
2641
    context variable and then adding hints of the current kind.
2642
    Then the context variable index_hint_type can be reset to the
2643
    next hint type.
2644
*/
2645
void st_select_lex::set_index_hint_type(enum index_hint_type type_arg,
2646
                                        index_clause_map clause)
2647
{ 
2648
  current_index_hint_type= type_arg;
2649
  current_index_hint_clause= clause;
2650
}
2651
2652
2653
/*
2654
  Makes an array to store index usage hints (ADD/FORCE/IGNORE INDEX).
2655
2656
  SYNOPSIS
2657
    alloc_index_hints()
2658
      thd         current thread.
2659
*/
2660
2661
void st_select_lex::alloc_index_hints (THD *thd)
2662
{ 
2663
  index_hints= new (thd->mem_root) List<Index_hint>(); 
2664
}
2665
2666
2667
2668
/*
2669
  adds an element to the array storing index usage hints 
2670
  (ADD/FORCE/IGNORE INDEX).
2671
2672
  SYNOPSIS
2673
    add_index_hint()
2674
      thd         current thread.
2675
      str         name of the index.
2676
      length      number of characters in str.
2677
2678
  RETURN VALUE
2679
    0 on success, non-zero otherwise
2680
*/
2681
bool st_select_lex::add_index_hint (THD *thd, char *str, uint length)
2682
{
2683
  return index_hints->push_front (new (thd->mem_root) 
2684
                                 Index_hint(current_index_hint_type,
2685
                                            current_index_hint_clause,
2686
                                            str, length));
2687
}