sql_lex.h 19.7 KB
Newer Older
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
2

bk@work.mysql.com's avatar
bk@work.mysql.com committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
7

bk@work.mysql.com's avatar
bk@work.mysql.com committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
12

bk@work.mysql.com's avatar
bk@work.mysql.com committed
13 14 15 16 17 18 19 20 21 22 23 24
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


/* YACC and LEX Definitions */

/* These may not be declared yet */
class Table_ident;
class sql_exchange;
class LEX_COLUMN;

25 26 27 28
/*
  The following hack is needed because mysql_yacc.cc does not define
  YYSTYPE before including this file
*/
bk@work.mysql.com's avatar
bk@work.mysql.com committed
29

30 31
#include "set_var.h"

bk@work.mysql.com's avatar
bk@work.mysql.com committed
32 33 34 35 36 37 38 39
#ifdef MYSQL_YACC
#define LEX_YYSTYPE void *
#else
#include "lex_symbol.h"
#include "sql_yacc.h"
#define LEX_YYSTYPE YYSTYPE *
#endif

40 41 42 43 44
/*
  When a command is added here, be sure it's also added in mysqld.cc
  in "struct show_var_st status_vars[]= {" ...
*/

bk@work.mysql.com's avatar
bk@work.mysql.com committed
45
enum enum_sql_command {
46 47 48 49 50
  SQLCOM_SELECT, SQLCOM_CREATE_TABLE, SQLCOM_CREATE_INDEX, SQLCOM_ALTER_TABLE,
  SQLCOM_UPDATE, SQLCOM_INSERT, SQLCOM_INSERT_SELECT,
  SQLCOM_DELETE, SQLCOM_TRUNCATE, SQLCOM_DROP_TABLE, SQLCOM_DROP_INDEX,

  SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,
tim@cane.mysql.fi's avatar
tim@cane.mysql.fi committed
51
  SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
52
  SQLCOM_SHOW_INNODB_STATUS,
53
  SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
54
  SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
55
  SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB,
56

bk@work.mysql.com's avatar
bk@work.mysql.com committed
57
  SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
58
  SQLCOM_GRANT,
59
  SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,
60
  SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,
61
  SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
62 63
  SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK, 
  SQLCOM_ASSIGN_TO_KEYCACHE, SQLCOM_PRELOAD_KEYS,
64
  SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
65 66
  SQLCOM_ROLLBACK, SQLCOM_ROLLBACK_TO_SAVEPOINT,
  SQLCOM_COMMIT, SQLCOM_SAVEPOINT,
67
  SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
68
  SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
69
  SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
70
  SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_PURGE_BEFORE, SQLCOM_SHOW_BINLOGS,
71
  SQLCOM_SHOW_OPEN_TABLES, SQLCOM_LOAD_MASTER_DATA,
72
  SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
73
  SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
74
  SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
75 76
  SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
  SQLCOM_SHOW_COLUMN_TYPES, SQLCOM_SHOW_TABLE_TYPES, SQLCOM_SHOW_PRIVILEGES,
77
  SQLCOM_HELP, SQLCOM_DROP_USER, SQLCOM_REVOKE_ALL, SQLCOM_CHECKSUM,
78 79 80

  /* This should be the last !!! */
  SQLCOM_END
bk@work.mysql.com's avatar
bk@work.mysql.com committed
81 82 83 84 85 86
};

typedef List<Item> List_item;

typedef struct st_lex_master_info
{
87
  char *host, *user, *password, *log_file_name;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
88 89
  uint port, connect_retry;
  ulonglong pos;
90
  ulong server_id;
91 92 93 94 95 96 97
  /* 
     Variable for MASTER_SSL option.
     MASTER_SSL=0 in CHANGE MASTER TO corresponds to SSL_DISABLE
     MASTER_SSL=1 corresponds to SSL_ENABLE
  */
  enum {SSL_UNCHANGED=0, SSL_DISABLE, SSL_ENABLE} ssl; 
  char *ssl_key, *ssl_cert, *ssl_ca, *ssl_capath, *ssl_cipher;
98
  char *relay_log_name;
99
  ulong relay_log_pos;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
100 101
} LEX_MASTER_INFO;

102

103 104
enum sub_select_type
{
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
105 106
  UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
  EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE, OLAP_TYPE
107 108 109 110
};

enum olap_type 
{
111
  UNSPECIFIED_OLAP_TYPE, CUBE_TYPE, ROLLUP_TYPE
112
};
113

heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
114 115 116 117 118
enum tablespace_op_type
{
  NO_TABLESPACE_OP, DISCARD_TABLESPACE, IMPORT_TABLESPACE
};

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
/* 
  The state of the lex parsing for selects 
   
   All select describing structures linked with following pointers:
   - list of neighbors (next/prev) (prev of first element point to slave 
     pointer of upper structure)
     - one level units for unit (union) structure
     - member of one union(unit) for ordinary select_lex
   - pointer to master
     - outer select_lex for unit (union)
     - unit structure for ordinary select_lex
   - pointer to slave
     - first list element of select_lex belonged to this unit for unit
     - first unit in list of units that belong to this select_lex (as
       subselects or derived tables) for ordinary select_lex
   - list of all select_lex (for group operation like correcting list of opened
     tables)
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
136 137 138 139 140 141
   - if unit contain several selects (union) then it have special 
     select_lex called fake_select_lex. It used for storing global parameters
     and executing union. subqueries of global ORDER BY clause will be
     attached to this fake_select_lex, which will allow them correctly
     resolve fields of 'upper' union and other more outer selects. 

142
   for example for following query:
143

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
   select *
     from table1
     where table1.field IN (select * from table1_1_1 union
                            select * from table1_1_2)
     union
   select *
     from table2
     where table2.field=(select (select f1 from table2_1_1_1_1
                                   where table2_1_1_1_1.f2=table2_1_1.f3)
                           from table2_1_1
                           where table2_1_1.f1=table2.f2)
     union
   select * from table3;

   we will have following structure:


     main unit
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
162
     fake0
163 164 165 166 167 168 169 170
     select1 select2 select3
     |^^     |^
    s|||     ||master
    l|||     |+---------------------------------+
    a|||     +---------------------------------+|
    v|||master                         slave   ||
    e||+-------------------------+             ||
     V|            neighbor      |             V|
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
171 172
     unit1.1<+==================>unit1.2       unit2.1
     fake1.1                                   fake2.1
173 174 175 176 177 178 179 180 181 182 183
     select1.1.1 select 1.1.2    select1.2.1   select2.1.1 select2.1.2
                                               |^
                                               ||
                                               V|
                                               unit2.1.1.1
                                               select2.1.1.1.1


   relation in main unit will be following:
                          
         main unit
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
184 185 186 187 188 189 190 191
         |^^^^|fake_select_lex
         |||||+--------------------------------------------+
         ||||+--------------------------------------------+|
         |||+------------------------------+              ||
         ||+--------------+                |              ||
    slave||master         |                |              ||
         V|      neighbor |       neighbor |        master|V
         select1<========>select2<========>select3        fake0
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207

    list of all select_lex will be following (as it will be constructed by
    parser):

    select1->select2->select3->select2.1.1->select 2.1.2->select2.1.1.1.1-+
                                                                          |
    +---------------------------------------------------------------------+
    |
    +->select1.1.1->select1.1.2

*/

/* 
    Base class for st_select_lex (SELECT_LEX) & 
    st_select_lex_unit (SELECT_LEX_UNIT)
*/
208
struct st_lex;
209 210
class st_select_lex;
class st_select_lex_unit;
211 212
class st_select_lex_node {
protected:
213 214 215
  st_select_lex_node *next, **prev,   /* neighbor list */
    *master, *slave,                  /* vertical links */
    *link_next, **link_prev;          /* list of whole SELECT_LEX */
216
public:
217 218 219 220 221 222 223
  enum enum_parsing_place
  {
    NO_MATTER,
    IN_HAVING,
    SELECT_LIST
  };

224
  ulong options;
225
  enum sub_select_type linkage;
226
  bool dependent;	/* dependent from outer select subselect */
227
  bool uncacheable;     /* result of this query can't be cached */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
228
  bool no_table_names_allowed; /* used for global order by */
229
  bool no_error; /* suppress error message (convert it to warnings) */
230 231 232

  static void *operator new(size_t size)
  {
233
    return (void*) sql_alloc((uint) size);
234
  }
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
235 236
  static void *operator new(size_t size, MEM_ROOT *mem_root)
  { return (void*) alloc_root(mem_root, (uint) size); }
237
  static void operator delete(void *ptr,size_t size) {}
238
  st_select_lex_node(): linkage(UNSPECIFIED_TYPE) {}
239 240 241 242
  virtual ~st_select_lex_node() {}
  inline st_select_lex_node* get_master() { return master; }
  virtual void init_query();
  virtual void init_select();
243 244
  void include_down(st_select_lex_node *upper);
  void include_neighbour(st_select_lex_node *before);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
245
  void include_standalone(st_select_lex_node *sel, st_select_lex_node **ref);
246 247
  void include_global(st_select_lex_node **plink);
  void exclude();
248 249 250

  virtual st_select_lex_unit* master_unit()= 0;
  virtual st_select_lex* outer_select()= 0;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
251
  virtual st_select_lex* return_after_parsing()= 0;
252 253 254 255 256 257 258 259

  virtual bool set_braces(bool value);
  virtual bool inc_in_sum_expr();
  virtual uint get_in_sum_expr();
  virtual TABLE_LIST* get_table_list();
  virtual List<Item>* get_item_list();
  virtual List<String>* get_use_index();
  virtual List<String>* get_ignore_index();
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
260
  virtual ulong get_table_join_options();
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
261
  virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table,
262
					LEX_STRING *alias,
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
263
					ulong table_options,
264 265
					thr_lock_type flags= TL_UNLOCK,
					List<String> *use_index= 0,
igor@rurik.mysql.com's avatar
igor@rurik.mysql.com committed
266 267
					List<String> *ignore_index= 0,
                                        LEX_STRING *option= 0);
268
  virtual void set_lock_for_tables(thr_lock_type lock_type) {}
269

270
  friend class st_select_lex_unit;
271
  friend bool mysql_new_select(struct st_lex *lex, bool move_down);
272 273 274
private:
  void fast_exclude();
};
275
typedef class st_select_lex_node SELECT_LEX_NODE;
276 277 278 279 280

/* 
   SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group 
   SELECT_LEXs
*/
281
struct st_lex;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
282 283 284 285
class THD;
class select_result;
class JOIN;
class select_union;
286
class st_select_lex_unit: public st_select_lex_node {
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
287 288 289 290 291
protected:
  List<Item> item_list; 
  TABLE_LIST result_table_list;
  select_union *union_result;
  TABLE *table; /* temporary table using for appending UNION results */
292

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
293 294
  select_result *result;
  int res;
Sinisa@sinisa.nasamreza.org's avatar
Sinisa@sinisa.nasamreza.org committed
295 296
  ulong describe, found_rows_for_union;
  bool  prepared, // prepare phase already performed for UNION (unit)
297
    optimized, // optimize phase already performed for UNION (unit)
Sinisa@sinisa.nasamreza.org's avatar
Sinisa@sinisa.nasamreza.org committed
298 299
    executed, // already executed
    t_and_f;  // used for transferring tables_and_fields_initied UNIT:: methods 
300
public:
301 302 303 304
  /*
    Pointer to 'last' select or pointer to unit where stored
    global parameters for union
  */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
305
  st_select_lex *global_parameters;
306
  //node on wich we should return current_select pointer after parsing subquery
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
307
  st_select_lex *return_to;
308 309
  /* LIMIT clause runtime counters */
  ha_rows select_limit_cnt, offset_limit_cnt;
310
  /* not NULL if unit used in subselect, point to subselect item */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
311
  Item_subselect *item;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
312
  /* thread handler */
313
  THD *thd;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
314 315
  /* fake SELECT_LEX for union processing */
  st_select_lex *fake_select_lex;
316

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
317
  uint union_option;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
318

319
  void init_query();
320 321
  bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result,
			 bool check_current_derived);
322 323
  st_select_lex_unit* master_unit();
  st_select_lex* outer_select();
324
  st_select_lex* first_select() { return (st_select_lex*) slave; }
325 326
  st_select_lex* first_select_in_union() 
  { 
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
327
    return (st_select_lex*) slave;
328
  }
329
  st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
330
  st_select_lex* return_after_parsing() { return return_to; }
331
  void exclude_level();
332
  void exclude_tree();
333

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
334
  /* UNION methods */
335
  int prepare(THD *thd, select_result *result, bool tables_and_fields_initied);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
336 337 338
  int exec();
  int cleanup();
  
339
  friend void mysql_init_query(THD *thd);
340
  friend int subselect_union_engine::exec();
341 342
private:
  bool create_total_list_n_last_return(THD *thd, st_lex *lex,
343 344
				       TABLE_LIST ***result,
				       bool check_current_derived);
345
};
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
346
typedef class st_select_lex_unit SELECT_LEX_UNIT;
347 348 349 350

/*
  SELECT_LEX - store information of parsed SELECT_LEX statment
*/
351 352
class st_select_lex: public st_select_lex_node
{
353
public:
354 355
  char *db, *db1, *table1, *db2, *table2;      	/* For outer join using .. */
  Item *where, *having;                         /* WHERE & HAVING clauses */
356
  Item *prep_where; /* saved WHERE clause for prepared statement processing */
357
  enum olap_type olap;
358 359 360
  SQL_LIST	      table_list, group_list;   /* FROM & GROUP BY clauses */
  List<Item>          item_list; /* list of fields & expressions */
  List<String>        interval_list, use_index, *use_index_ptr,
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
361
		      ignore_index, *ignore_index_ptr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
362 363 364 365 366 367
  /* 
    Usualy it is pointer to ftfunc_list_alloc, but in union used to create fake
    select_lex for calling mysql_select under results of union
  */
  List<Item_func_match> *ftfunc_list;
  List<Item_func_match> ftfunc_list_alloc;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
368
  JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
369
  const char *type; /* type of select for EXPLAIN */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
370 371 372 373 374 375 376 377

  SQL_LIST order_list;                /* ORDER clause */
  List<List_item>     expr_list;
  List<List_item>     when_list;      /* WHEN clause (expression) */
  ha_rows select_limit, offset_limit; /* LIMIT clause parameters */
  // Arrays of pointers to top elements of all_fields list
  Item **ref_pointer_array;

bell@sanja.is.com.ua's avatar
merge  
bell@sanja.is.com.ua committed
378 379 380 381 382 383
  /*
    number of items in select_list and HAVING clause used to get number
    bigger then can be number of entries that will be added to all item
    list during split_sum_func
  */
  uint select_n_having_items;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
384 385 386 387
  uint cond_count;      /* number of arguments of and/or/xor in where/having */
  enum_parsing_place parsing_place; /* where we are parsing expression */
  bool with_sum_func;   /* sum function indicator */

monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
388
  ulong table_join_options;
389
  uint in_sum_expr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
390
  uint select_number; /* number of select (used for EXPLAIN) */
391
  uint with_wild; /* item list contain '*' */
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
392 393 394
  bool  braces;   	/* SELECT ... UNION (SELECT ... ) <- this braces */
  /* TRUE when having fix field called in processing of this SELECT */
  bool having_fix_field;
395

396
  /* 
397 398 399 400 401 402 403 404 405 406
     SELECT for SELECT command st_select_lex. Used to privent scaning
     item_list of non-SELECT st_select_lex (no sense find to finding
     reference in it (all should be in tables, it is dangerouse due
     to order of fix_fields calling for non-SELECTs commands (item list
     can be not fix_fieldsd)). This value will be assigned for
     primary select (sql_yac.yy) and for any subquery and
     UNION SELECT (sql_parse.cc mysql_new_select())


     INSERT for primary st_select_lex structure of simple INSERT/REPLACE
407 408 409 410
     (used for name resolution, see Item_fiels & Item_ref fix_fields,
     FALSE for INSERT/REPLACE ... SELECT, because it's
     st_select_lex->table_list will be preprocessed (first table removed)
     before passing to handle_select)
411 412

     NOMATTER for other
413
  */
414 415
  enum {NOMATTER_MODE, SELECT_MODE, INSERT_MODE} resolve_mode;

416

417 418
  void init_query();
  void init_select();
419
  st_select_lex_unit* master_unit();
420 421 422 423
  st_select_lex_unit* first_inner_unit() 
  { 
    return (st_select_lex_unit*) slave; 
  }
424
  st_select_lex* outer_select();
425
  st_select_lex* next_select() { return (st_select_lex*) next; }
426
  st_select_lex* next_select_in_list() 
427 428 429 430 431 432 433
  {
    return (st_select_lex*) link_next;
  }
  st_select_lex_node** next_select_in_list_addr()
  {
    return &link_next;
  }
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
434
  st_select_lex* return_after_parsing()
435 436 437
  {
    return master_unit()->return_after_parsing();
  }
438

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
439 440
  void mark_as_dependent(st_select_lex *last);

441 442 443
  bool set_braces(bool value);
  bool inc_in_sum_expr();
  uint get_in_sum_expr();
444

monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
445 446
  bool add_item_to_list(THD *thd, Item *item);
  bool add_group_to_list(THD *thd, Item *item, bool asc);
447
  bool add_ftfunc_to_list(Item_func_match *func);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
448
  bool add_order_to_list(THD *thd, Item *item, bool asc);
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
449
  TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table,
450
				LEX_STRING *alias,
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
451
				ulong table_options,
452 453
				thr_lock_type flags= TL_UNLOCK,
				List<String> *use_index= 0,
454 455
				List<String> *ignore_index= 0,
                                LEX_STRING *option= 0);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
456 457 458 459 460
  TABLE_LIST* get_table_list();
  List<Item>* get_item_list();
  List<String>* get_use_index();
  List<String>* get_ignore_index();
  ulong get_table_join_options();
461
  void set_lock_for_tables(thr_lock_type lock_type);
462 463 464 465 466 467
  inline void init_order()
  {
    order_list.elements= 0;
    order_list.first= 0;
    order_list.next= (byte**) &order_list.first;
  }
468
  
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
469 470
  bool test_limit();

471
  friend void mysql_init_query(THD *thd);
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
472 473
  st_select_lex() {}
  void make_empty_select()
474 475 476 477
  {
    init_query();
    init_select();
  }
bell@laptop.sanja.is.com.ua's avatar
bell@laptop.sanja.is.com.ua committed
478
  bool setup_ref_array(THD *thd, uint order_group_num);
479
};
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
480
typedef class st_select_lex SELECT_LEX;
481 482


bk@work.mysql.com's avatar
bk@work.mysql.com committed
483 484
/* The state of the lex parsing. This is saved in the THD struct */

485 486
typedef struct st_lex
{
bk@work.mysql.com's avatar
bk@work.mysql.com committed
487 488
  uint	 yylineno,yytoklen;			/* Simulate lex */
  LEX_YYSTYPE yylval;
489
  SELECT_LEX_UNIT unit;                         /* most upper unit */
490 491
  SELECT_LEX select_lex;                        /* first SELECT_LEX */
  /* current SELECT_LEX in parsing */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
492
  SELECT_LEX *current_select;
493 494
  /* list of all SELECT_LEX */
  SELECT_LEX *all_selects_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
495 496
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
serg@serg.mylan's avatar
serg@serg.mylan committed
497
  char *help_arg;
498
  char *backup_dir;				/* For RESTORE/BACKUP */
499
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
500
  time_t purge_time;                            /* For PURGE MASTER LOGS BEFORE */
501
  char* x509_subject,*x509_issuer,*ssl_cipher;
502
  char* found_colon;                            /* For multi queries - next query */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
503 504
  String *wild;
  sql_exchange *exchange;
505
  select_result *result;
bar@bar.mysql.r18.ru's avatar
bar@bar.mysql.r18.ru committed
506 507
  Item *default_value;
  LEX_STRING *comment;
serg@serg.mylan's avatar
serg@serg.mylan committed
508 509 510 511 512
  LEX_USER *grant_user;
  gptr yacc_yyss,yacc_yyvs;
  THD *thd;
  CHARSET_INFO *charset;
  SQL_LIST *gorder_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
513 514

  List<key_part_spec> col_list;
515
  List<key_part_spec> ref_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
516 517
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
518
  List<String>	      interval_list;
519
  List<LEX_USER>      users_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
520 521 522
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
523 524
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
525
  List<set_var_base>  var_list;
526
  List<Item>          param_list;
527
  SQL_LIST	      proc_list, auxilliary_table_list, save_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
528 529
  TYPELIB	      *interval;
  create_field	      *last_field;
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
530
  char		      *savepoint_name;		// Transaction savepoint id
bk@work.mysql.com's avatar
bk@work.mysql.com committed
531
  udf_func udf;
532 533
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
534
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
535
  USER_RESOURCES mqh;
536 537
  ulong thread_id,type;
  enum_sql_command sql_command;
538
  thr_lock_type lock_option;
serg@serg.mylan's avatar
serg@serg.mylan committed
539
  enum SSL_type ssl_type;			/* defined in violite.h */
540
  enum my_lex_states next_state;
541
  enum enum_duplicates duplicates;
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
542
  enum enum_tx_isolation tx_isolation;
543 544
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
545
  enum enum_enable_or_disable alter_keys_onoff;
546
  enum enum_var_type option_type;
heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
547
  enum tablespace_op_type tablespace_op;
serg@serg.mylan's avatar
serg@serg.mylan committed
548
  uint uint_geom_type;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
549
  uint grant, grant_tot_col, which_columns;
550
  uint fk_delete_opt, fk_update_opt, fk_match_option;
551
  uint param_count;
serg@serg.mylan's avatar
serg@serg.mylan committed
552
  uint slave_thd_opt;
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
553
  bool drop_primary, drop_if_exists, drop_temporary, local_file;
554
  bool in_comment, ignore_space, verbose, simple_alter, no_write_to_binlog;
555
  bool derived_tables, describe;
556
  bool safe_to_cache_query;
557
  st_lex() {}
558 559 560
  inline void uncacheable()
  {
    safe_to_cache_query= 0;
561 562 563 564 565 566

    /*
      There are no sense to mark select_lex and union fields of LEX,
      but we should merk all subselects as uncacheable from current till
      most upper
    */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
567
    SELECT_LEX *sl;
568 569 570 571
    SELECT_LEX_UNIT *un;
    for (sl= current_select, un= sl->master_unit();
	 un != &unit;
	 sl= sl->outer_select(), un= sl->master_unit())
572
    {
573
      sl->uncacheable = un->uncacheable= 1;
574
    }
575
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
576 577 578 579 580 581 582 583 584 585 586 587 588
} LEX;


void lex_init(void);
void lex_free(void);
LEX *lex_start(THD *thd, uchar *buf,uint length);
void lex_end(LEX *lex);

extern pthread_key(LEX*,THR_LEX);

extern LEX_STRING tmp_table_alias;

#define current_lex (&current_thd->lex)