sql_lex.h 15.6 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
unknown's avatar
unknown committed
2

unknown's avatar
unknown 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.
unknown's avatar
unknown committed
7

unknown's avatar
unknown 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.
unknown's avatar
unknown committed
12

unknown's avatar
unknown 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
*/
unknown's avatar
unknown committed
29

unknown's avatar
unknown committed
30 31
#include "set_var.h"

unknown's avatar
unknown 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[]= {" ...
*/

unknown's avatar
unknown 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,
unknown's avatar
unknown committed
51
  SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
unknown's avatar
unknown 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,
unknown's avatar
unknown committed
55
  SQLCOM_SHOW_CREATE_DB,
56

unknown's avatar
unknown 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 62 63
  SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
  SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
  SQLCOM_FLUSH, SQLCOM_KILL,  SQLCOM_ANALYZE,
unknown's avatar
unknown committed
64
  SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
65
  SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
unknown's avatar
unknown committed
66
  SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
67
  SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS,
68
  SQLCOM_SHOW_OPEN_TABLES, SQLCOM_LOAD_MASTER_DATA,
69
  SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
70
  SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
unknown's avatar
unknown committed
71
  SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
unknown's avatar
unknown committed
72 73
  SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
  SQLCOM_SHOW_COLUMN_TYPES, SQLCOM_SHOW_TABLE_TYPES, SQLCOM_SHOW_PRIVILEGES,
74 75 76 77
  SQLCOM_HELP,

  /* This should be the last !!! */
  SQLCOM_END
unknown's avatar
unknown committed
78 79
};

unknown's avatar
unknown committed
80 81 82 83 84 85 86 87
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,
unknown's avatar
unknown committed
88
  STATE_HOSTNAME, STATE_SKIP, STATE_USER_VARIABLE_DELIMITER, STATE_SYSTEM_VAR,
unknown's avatar
unknown committed
89
  STATE_IDENT_OR_KEYWORD, STATE_IDENT_OR_HEX, STATE_IDENT_OR_BIN
unknown's avatar
unknown committed
90 91
};

unknown's avatar
unknown committed
92

unknown's avatar
unknown committed
93 94 95 96
typedef List<Item> List_item;

typedef struct st_lex_master_info
{
97
  char *host, *user, *password, *log_file_name;
unknown's avatar
unknown committed
98 99
  uint port, connect_retry;
  ulonglong pos;
unknown's avatar
unknown committed
100
  ulong server_id;
101
  char *relay_log_name;
102
  ulong relay_log_pos;
unknown's avatar
unknown committed
103 104
} LEX_MASTER_INFO;

105

106 107
enum sub_select_type
{
unknown's avatar
unknown committed
108 109
  UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
  EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE, OLAP_TYPE
110 111 112 113
};

enum olap_type 
{
114
  UNSPECIFIED_OLAP_TYPE, CUBE_TYPE, ROLLUP_TYPE
115
};
116

unknown's avatar
unknown committed
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
/* 
  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:
135

unknown's avatar
unknown committed
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 189 190 191 192 193 194 195 196
   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)
*/
197 198
class st_select_lex;
class st_select_lex_unit;
199 200
class st_select_lex_node {
protected:
unknown's avatar
unknown committed
201 202 203
  st_select_lex_node *next, **prev,   /* neighbor list */
    *master, *slave,                  /* vertical links */
    *link_next, **link_prev;          /* list of whole SELECT_LEX */
204 205
public:
  ulong options;
206
  enum sub_select_type linkage;
unknown's avatar
unknown committed
207
  SQL_LIST order_list;                /* ORDER clause */
208 209
  List<List_item>     expr_list;
  List<List_item>     when_list;      /* WHEN clause (expression) */
unknown's avatar
unknown committed
210
  ha_rows select_limit, offset_limit; /* LIMIT clause parameters */
211
  bool with_sum_func;
212 213 214 215 216 217 218 219 220 221 222 223
  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();
unknown's avatar
unknown committed
224 225 226 227
  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();
228

unknown's avatar
unknown committed
229
  virtual st_select_lex* select_lex();
unknown's avatar
unknown committed
230 231 232
  virtual bool add_item_to_list(THD *thd, Item *item);
  bool add_order_to_list(THD *thd, Item *item, bool asc);
  virtual bool add_group_to_list(THD *thd, Item *item, bool asc);
233 234 235 236 237 238 239 240 241 242 243 244
  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();
unknown's avatar
unknown committed
245
  virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table,
246 247 248 249 250
					LEX_STRING *alias,
					bool updating,
					thr_lock_type flags= TL_UNLOCK,
					List<String> *use_index= 0,
					List<String> *ignore_index= 0);
unknown's avatar
unknown committed
251
  virtual void set_lock_for_tables(thr_lock_type lock_type) {}
unknown's avatar
unknown committed
252
  void mark_as_dependent(st_select_lex *last);
unknown's avatar
unknown committed
253 254

  friend class st_select_lex_unit;
unknown's avatar
unknown committed
255 256 257
private:
  void fast_exclude();
};
258
typedef class st_select_lex_node SELECT_LEX_NODE;
unknown's avatar
unknown committed
259 260 261 262 263

/* 
   SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group 
   SELECT_LEXs
*/
264
struct st_lex;
unknown's avatar
unknown committed
265 266 267 268
class THD;
class select_result;
class JOIN;
class select_union;
269
class st_select_lex_unit: public st_select_lex_node {
unknown's avatar
unknown committed
270 271 272 273 274 275 276 277 278 279
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,
unknown's avatar
unknown committed
280 281 282
    prepared, // prepare phase already performed for UNION (unit)
    optimized, // optimize phase already performed for UNION (unit)
    executed; // already executed
283
public:
unknown's avatar
unknown committed
284 285 286 287 288 289 290
  /*
    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;
unknown's avatar
unknown committed
291 292
  /* not NULL if union used in subselect, point to subselect item */
  Item_subselect *item;
unknown's avatar
unknown committed
293
  uint union_option;
unknown's avatar
unknown committed
294

unknown's avatar
unknown committed
295
  void init_query();
296
  bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
297 298
  st_select_lex_unit* master_unit();
  st_select_lex* outer_select();
unknown's avatar
unknown committed
299 300
  st_select_lex* first_select() { return (st_select_lex*) slave; }
  st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
unknown's avatar
unknown committed
301
  void st_select_lex_unit::exclude_level();
302

unknown's avatar
unknown committed
303 304 305 306 307
  /* UNION methods */
  int prepare(THD *thd, select_result *result);
  int exec();
  int cleanup();
  
308
  friend void mysql_init_query(THD *thd);
309
  friend int subselect_union_engine::exec();
310 311 312
private:
  bool create_total_list_n_last_return(THD *thd, st_lex *lex,
				       TABLE_LIST ***result);
unknown's avatar
unknown committed
313
};
unknown's avatar
cleanup  
unknown committed
314
typedef class st_select_lex_unit SELECT_LEX_UNIT;
unknown's avatar
unknown committed
315 316 317 318

/*
  SELECT_LEX - store information of parsed SELECT_LEX statment
*/
319 320
class st_select_lex: public st_select_lex_node
{
321
public:
unknown's avatar
unknown committed
322 323
  char *db, *db1, *table1, *db2, *table2;      	/* For outer join using .. */
  Item *where, *having;                         /* WHERE & HAVING clauses */
324
  enum olap_type olap;
unknown's avatar
unknown committed
325 326 327
  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,
unknown's avatar
unknown committed
328
		      ignore_index, *ignore_index_ptr;
unknown's avatar
unknown committed
329 330 331 332 333 334
  /* 
    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;
unknown's avatar
unknown committed
335
  JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
unknown's avatar
unknown committed
336
  const char *type; /* type of select for EXPLAIN */
337
  uint in_sum_expr;
unknown's avatar
unknown committed
338
  uint select_number; /* number of select (used for EXPLAIN) */
unknown's avatar
unknown committed
339 340 341
  bool  braces;   	/* SELECT ... UNION (SELECT ... ) <- this braces */
  /* TRUE when having fix field called in processing of this SELECT */
  bool having_fix_field;
unknown's avatar
unknown committed
342

unknown's avatar
unknown committed
343 344
  void init_query();
  void init_select();
345
  st_select_lex_unit* master_unit();
346 347 348 349
  st_select_lex_unit* first_inner_unit() 
  { 
    return (st_select_lex_unit*) slave; 
  }
350
  st_select_lex* outer_select();
unknown's avatar
unknown committed
351
  st_select_lex* next_select() { return (st_select_lex*) next; }
352
  st_select_lex* next_select_in_list() 
353 354 355 356 357 358 359 360
  {
    return (st_select_lex*) link_next;
  }
  st_select_lex_node** next_select_in_list_addr()
  {
    return &link_next;
  }

361 362 363
  bool set_braces(bool value);
  bool inc_in_sum_expr();
  uint get_in_sum_expr();
unknown's avatar
unknown committed
364 365

  st_select_lex* select_lex();
unknown's avatar
unknown committed
366 367
  bool add_item_to_list(THD *thd, Item *item);
  bool add_group_to_list(THD *thd, Item *item, bool asc);
368 369 370 371 372 373
  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();
unknown's avatar
unknown committed
374
  TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table,
375 376 377 378 379
				LEX_STRING *alias,
				bool updating,
				thr_lock_type flags= TL_UNLOCK,
				List<String> *use_index= 0,
				List<String> *ignore_index= 0);
unknown's avatar
unknown committed
380
  void set_lock_for_tables(thr_lock_type lock_type);
unknown's avatar
unknown committed
381 382 383 384 385 386
  inline void init_order()
  {
    order_list.elements= 0;
    order_list.first= 0;
    order_list.next= (byte**) &order_list.first;
  }
387
  
388
  friend void mysql_init_query(THD *thd);
unknown's avatar
unknown committed
389
};
unknown's avatar
cleanup  
unknown committed
390
typedef class st_select_lex SELECT_LEX;
391 392


unknown's avatar
unknown committed
393 394
/* The state of the lex parsing. This is saved in the THD struct */

395 396
typedef struct st_lex
{
unknown's avatar
unknown committed
397 398
  uint	 yylineno,yytoklen;			/* Simulate lex */
  LEX_YYSTYPE yylval;
unknown's avatar
unknown committed
399
  SELECT_LEX_UNIT unit;                         /* most upper unit */
400 401 402
  SELECT_LEX select_lex;                        /* first SELECT_LEX */
  /* current SELECT_LEX in parsing */
  SELECT_LEX_NODE *current_select;
403 404
  /* list of all SELECT_LEX */
  SELECT_LEX *all_selects_list;
unknown's avatar
unknown committed
405 406
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
407
  char *backup_dir;				/* For RESTORE/BACKUP */
unknown's avatar
unknown committed
408
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
409
  char* x509_subject,*x509_issuer,*ssl_cipher;
410
  enum SSL_type ssl_type;			/* defined in violite.h */
unknown's avatar
unknown committed
411 412
  String *wild;
  sql_exchange *exchange;
unknown's avatar
unknown committed
413
  select_result *result;
unknown's avatar
unknown committed
414 415

  List<key_part_spec> col_list;
416
  List<key_part_spec> ref_list;
unknown's avatar
unknown committed
417 418
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
419
  List<String>	      interval_list;
unknown's avatar
unknown committed
420
  List<LEX_USER>      users_list;
unknown's avatar
unknown committed
421 422 423
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
424 425
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
unknown's avatar
unknown committed
426
  List<set_var_base>  var_list;
unknown's avatar
unknown committed
427
  List<Item>          param_list;
428
  SQL_LIST	      proc_list, auxilliary_table_list;
unknown's avatar
unknown committed
429 430
  TYPELIB	      *interval;
  create_field	      *last_field;
431
  Item *default_value, *comment;
unknown's avatar
unknown committed
432
  CONVERT *convert_set;
unknown's avatar
unknown committed
433
  CONVERT *thd_convert_set;			// Set with SET CHAR SET
434
  LEX_USER *grant_user;
unknown's avatar
unknown committed
435
  gptr yacc_yyss,yacc_yyvs;
unknown's avatar
unknown committed
436
  THD *thd;
unknown's avatar
unknown committed
437
  udf_func udf;
438 439
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
unknown's avatar
unknown committed
440
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
441
  USER_RESOURCES mqh;
442 443
  ulong thread_id,type;
  enum_sql_command sql_command;
444
  thr_lock_type lock_option;
445 446
  enum lex_states next_state;
  enum enum_duplicates duplicates;
unknown's avatar
unknown committed
447
  enum enum_tx_isolation tx_isolation;
448 449
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
450
  enum enum_enable_or_disable alter_keys_onoff;
unknown's avatar
unknown committed
451
  enum enum_var_type option_type;
unknown's avatar
unknown committed
452
  uint grant, grant_tot_col, which_columns;
453
  uint fk_delete_opt, fk_update_opt, fk_match_option;
454
  uint param_count;
unknown's avatar
unknown committed
455
  bool drop_primary, drop_if_exists, drop_temporary, local_file;
unknown's avatar
unknown committed
456
  bool in_comment, ignore_space, verbose, simple_alter;
unknown's avatar
unknown committed
457
  bool derived_tables, describe, olap;
458
  bool safe_to_cache_query;
459
  uint slave_thd_opt;
460
  CHARSET_INFO *charset;
unknown's avatar
unknown committed
461
  char *help_arg;
unknown's avatar
unknown committed
462 463 464 465 466 467 468 469 470 471 472 473 474
} 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)