sql_lex.h 15 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 40
#ifdef MYSQL_YACC
#define LEX_YYSTYPE void *
#else
#include "lex_symbol.h"
#include "sql_yacc.h"
#define LEX_YYSTYPE YYSTYPE *
#endif

enum enum_sql_command {
41 42 43 44 45
  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
46
  SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
heikki@hundin.mysql.fi's avatar
heikki@hundin.mysql.fi committed
47
  SQLCOM_SHOW_INNODB_STATUS,
48
  SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
49
  SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
50
  SQLCOM_SHOW_CREATE_DB,
51

bk@work.mysql.com's avatar
bk@work.mysql.com committed
52
  SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
53 54
  SQLCOM_GRANT, 
  SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,
55 56 57 58
  SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT, 
  SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
  SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
  SQLCOM_FLUSH, SQLCOM_KILL,  SQLCOM_ANALYZE,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
59
  SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
60
  SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
61
  SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
62
  SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS,
63
  SQLCOM_SHOW_OPEN_TABLES, SQLCOM_LOAD_MASTER_DATA,
64
  SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
65
  SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_MULTI_UPDATE,
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
66
  SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
67 68
  SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
  SQLCOM_SHOW_COLUMN_TYPES, SQLCOM_SHOW_TABLE_TYPES, SQLCOM_SHOW_PRIVILEGES,
69
  SQLCOM_END, SQLCOM_HELP
bk@work.mysql.com's avatar
bk@work.mysql.com committed
70 71
};

72 73 74 75 76 77 78 79
enum lex_states
{
  STATE_START, STATE_CHAR, STATE_IDENT, STATE_IDENT_SEP, STATE_IDENT_START,
  STATE_FOUND_IDENT, STATE_SIGNED_NUMBER, STATE_REAL, STATE_HEX_NUMBER,
  STATE_CMP_OP, STATE_LONG_CMP_OP, STATE_STRING, STATE_COMMENT, STATE_END,
  STATE_OPERATOR_OR_IDENT, STATE_NUMBER_IDENT, STATE_INT_OR_REAL,
  STATE_REAL_OR_POINT, STATE_BOOL, STATE_EOL, STATE_ESCAPE, STATE_LONG_COMMENT,
  STATE_END_LONG_COMMENT, STATE_COLON, STATE_SET_VAR, STATE_USER_END,
80 81
  STATE_HOSTNAME, STATE_SKIP, STATE_USER_VARIABLE_DELIMITER, STATE_SYSTEM_VAR,
  STATE_IDENT_OR_KEYWORD
bk@work.mysql.com's avatar
bk@work.mysql.com committed
82 83
};

monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
84

bk@work.mysql.com's avatar
bk@work.mysql.com committed
85 86 87 88
typedef List<Item> List_item;

typedef struct st_lex_master_info
{
89
  char *host, *user, *password, *log_file_name;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
90 91
  uint port, connect_retry;
  ulonglong pos;
92
  ulong server_id;
93
  char *relay_log_name;
94
  ulong relay_log_pos;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
95 96
} LEX_MASTER_INFO;

97

98 99
enum sub_select_type
{
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
100 101
  UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
  EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE, OLAP_TYPE
102 103 104 105
};

enum olap_type 
{
106
  UNSPECIFIED_OLAP_TYPE, CUBE_TYPE, ROLLUP_TYPE
107
};
108

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
/* 
  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)
   for example for following query:
127

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
   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
     select1 select2 select3
     |^^     |^
    s|||     ||master
    l|||     |+---------------------------------+
    a|||     +---------------------------------+|
    v|||master                         slave   ||
    e||+-------------------------+             ||
     V|            neighbor      |             V|
     unit 1.1<==================>unit1.2       unit2.1
     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
         |^^^
         ||||
         |||+------------------------------+
         ||+--------------+                |
    slave||master         |                |
         V|      neighbor |       neighbor |
         select1<========>select2<========>select3

    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)
*/
189 190
class st_select_lex;
class st_select_lex_unit;
191 192
class st_select_lex_node {
protected:
193 194 195
  st_select_lex_node *next, **prev,   /* neighbor list */
    *master, *slave,                  /* vertical links */
    *link_next, **link_prev;          /* list of whole SELECT_LEX */
196 197
public:
  ulong options;
198
  enum sub_select_type linkage;
199
  SQL_LIST order_list;                /* ORDER clause */
200 201
  List<List_item>     expr_list;
  List<List_item>     when_list;      /* WHEN clause (expression) */
202
  ha_rows select_limit, offset_limit; /* LIMIT clause parameters */
203
  bool with_sum_func;
204 205 206 207 208 209 210 211 212 213 214 215
  bool	create_refs;
  bool dependent;	/* dependent from outer select subselect */

  static void *operator new(size_t size)
  {
    return (void*) sql_calloc((uint) size);
  }
  static void operator delete(void *ptr,size_t size) {}
  virtual ~st_select_lex_node() {}
  inline st_select_lex_node* get_master() { return master; }
  virtual void init_query();
  virtual void init_select();
216 217 218 219
  void include_down(st_select_lex_node *upper);
  void include_neighbour(st_select_lex_node *before);
  void include_global(st_select_lex_node **plink);
  void exclude();
220

221
  virtual st_select_lex* select_lex();
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
  virtual bool add_item_to_list(Item *item);
  bool add_order_to_list(Item *item, bool asc);
  virtual bool add_group_to_list(Item *item, bool asc);
  virtual bool add_ftfunc_to_list(Item_func_match *func);

  virtual st_select_lex_unit* master_unit()= 0;
  virtual st_select_lex* outer_select()= 0;

  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();
  virtual TABLE_LIST *add_table_to_list(Table_ident *table,
					LEX_STRING *alias,
					bool updating,
					thr_lock_type flags= TL_UNLOCK,
					List<String> *use_index= 0,
					List<String> *ignore_index= 0);
243 244

  void mark_as_dependent(st_select_lex *last);
245 246 247
private:
  void fast_exclude();
};
248
typedef class st_select_lex_node SELECT_LEX_NODE;
249 250 251 252 253

/* 
   SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group 
   SELECT_LEXs
*/
254
struct st_lex;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
255 256 257 258
class THD;
class select_result;
class JOIN;
class select_union;
259
class st_select_lex_unit: public st_select_lex_node {
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
260 261 262 263 264 265 266 267 268 269
protected:
  List<Item> item_list; 
  List<JOIN*> joins; /* list of *JOINs, to delete it in cleanup() */
  TABLE_LIST result_table_list;
  select_union *union_result;
  TABLE *table; /* temporary table using for appending UNION results */
  THD *thd;
  select_result *result;
  int res;
  bool describe, found_rows_for_union,
270 271 272
    prepared, // prepare phase already performed for UNION (unit)
    optimized, // optimize phase already performed for UNION (unit)
    executed; // already executed
273
public:
274 275 276 277 278 279 280
  /*
    Pointer to 'last' select or pointer to unit where stored
    global parameters for union
  */
  st_select_lex_node *global_parameters;
  /* LIMIT clause runtime counters */
  ha_rows select_limit_cnt, offset_limit_cnt;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
281 282
  /* not NULL if union used in subselect, point to subselect item */
  Item_subselect *item;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
283
  uint union_option;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
284

285
  void init_query();
286
  bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
287 288
  st_select_lex_unit* master_unit();
  st_select_lex* outer_select();
289 290
  st_select_lex* first_select() { return (st_select_lex*) slave; }
  st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
291

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
292 293 294 295 296
  /* UNION methods */
  int prepare(THD *thd, select_result *result);
  int exec();
  int cleanup();
  
297
  friend void mysql_init_query(THD *thd);
298 299 300
private:
  bool create_total_list_n_last_return(THD *thd, st_lex *lex,
				       TABLE_LIST ***result);
301
};
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
302
typedef class st_select_lex_unit SELECT_LEX_UNIT;
303 304 305 306

/*
  SELECT_LEX - store information of parsed SELECT_LEX statment
*/
307 308
class st_select_lex: public st_select_lex_node
{
309
public:
310 311
  char *db, *db1, *table1, *db2, *table2;      	/* For outer join using .. */
  Item *where, *having;                         /* WHERE & HAVING clauses */
312
  enum olap_type olap;
313 314 315
  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
316
		      ignore_index, *ignore_index_ptr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
317 318 319 320 321 322
  /* 
    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
323
  JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
324
  const char *type; /* type of select for EXPLAIN */
325
  uint in_sum_expr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
326
  uint select_number; /* number of select (used for EXPLAIN) */
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
327 328 329
  bool  braces;   	/* SELECT ... UNION (SELECT ... ) <- this braces */
  /* TRUE when having fix field called in processing of this SELECT */
  bool having_fix_field;
330

331 332
  void init_query();
  void init_select();
333
  st_select_lex_unit* master_unit();
334 335 336 337
  st_select_lex_unit* first_inner_unit() 
  { 
    return (st_select_lex_unit*) slave; 
  }
338
  st_select_lex* outer_select();
339
  st_select_lex* next_select() { return (st_select_lex*) next; }
340 341 342 343 344 345 346 347 348
  st_select_lex*  next_select_in_list() 
  {
    return (st_select_lex*) link_next;
  }
  st_select_lex_node** next_select_in_list_addr()
  {
    return &link_next;
  }

349 350 351
  bool set_braces(bool value);
  bool inc_in_sum_expr();
  uint get_in_sum_expr();
352 353

  st_select_lex* select_lex();
354 355 356 357 358 359 360 361 362 363 364 365 366 367
  bool add_item_to_list(Item *item);
  bool add_group_to_list(Item *item, bool asc);
  bool add_ftfunc_to_list(Item_func_match *func);

  TABLE_LIST* get_table_list();
  List<Item>* get_item_list();
  List<String>* get_use_index();
  List<String>* get_ignore_index();
  TABLE_LIST* add_table_to_list(Table_ident *table,
				LEX_STRING *alias,
				bool updating,
				thr_lock_type flags= TL_UNLOCK,
				List<String> *use_index= 0,
				List<String> *ignore_index= 0);
368 369 370 371 372 373
  inline void init_order()
  {
    order_list.elements= 0;
    order_list.first= 0;
    order_list.next= (byte**) &order_list.first;
  }
374
  
375
  friend void mysql_init_query(THD *thd);
376
};
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
377
typedef class st_select_lex SELECT_LEX;
378 379


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

382 383
typedef struct st_lex
{
bk@work.mysql.com's avatar
bk@work.mysql.com committed
384 385
  uint	 yylineno,yytoklen;			/* Simulate lex */
  LEX_YYSTYPE yylval;
386
  SELECT_LEX_UNIT unit;                         /* most upper unit */
387 388 389
  SELECT_LEX select_lex;                        /* first SELECT_LEX */
  /* current SELECT_LEX in parsing */
  SELECT_LEX_NODE *current_select;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
390 391
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
392
  char *backup_dir;				/* For RESTORE/BACKUP */
393
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
394
  char* x509_subject,*x509_issuer,*ssl_cipher;
395
  enum SSL_type ssl_type;			/* defined in violite.h */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
396 397
  String *wild;
  sql_exchange *exchange;
398
  select_result *result;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
399 400

  List<key_part_spec> col_list;
401
  List<key_part_spec> ref_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
402 403
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
404
  List<String>	      interval_list;
405
  List<LEX_USER>      users_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
406 407 408
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
409 410
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
411
  List<set_var_base>  var_list;
412
  List<Item>          param_list;
413
  SQL_LIST	      proc_list, auxilliary_table_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
414 415
  TYPELIB	      *interval;
  create_field	      *last_field;
416
  Item *default_value, *comment;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
417
  CONVERT *convert_set;
418
  CONVERT *thd_convert_set;			// Set with SET CHAR SET
419
  LEX_USER *grant_user;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
420
  gptr yacc_yyss,yacc_yyvs;
421
  THD *thd;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
422
  udf_func udf;
423 424
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
425
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
426
  USER_RESOURCES mqh;
427 428
  ulong thread_id,type;
  enum_sql_command sql_command;
429
  thr_lock_type lock_option;
430 431
  enum lex_states next_state;
  enum enum_duplicates duplicates;
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
432
  enum enum_tx_isolation tx_isolation;
433 434
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
435
  enum enum_enable_or_disable alter_keys_onoff;
436
  enum enum_var_type option_type;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
437
  uint grant, grant_tot_col, which_columns;
438
  uint fk_delete_opt, fk_update_opt, fk_match_option;
439
  uint param_count;
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
440 441
  bool drop_primary, drop_if_exists, local_file, olap;
  bool in_comment, ignore_space, verbose, simple_alter;
442
  bool derived_tables, describe;
443
  uint slave_thd_opt;
444
  CHARSET_INFO *charset;
445
  char *help_arg;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
446 447 448 449 450 451 452 453 454 455 456 457 458
} 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)