You need to sign in or sign up before continuing.
sql_lex.h 13.2 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
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_node {
protected:
191 192 193
  st_select_lex_node *next, **prev,   /* neighbor list */
    *master, *slave,                  /* vertical links */
    *link_next, **link_prev;          /* list of whole SELECT_LEX */
194 195
public:
  ulong options;
196
  enum sub_select_type linkage;
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
  SQL_LIST order_list;                /* ORDER clause */
  ha_rows select_limit, offset_limit; /* LIMIT clause parameters */
  void init_query();
  void init_select();
  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();
private:
  void fast_exclude();
};

/* 
   SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group 
   SELECT_LEXs
*/
213
struct st_lex;
214
class st_select_lex;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
215 216 217 218
class THD;
class select_result;
class JOIN;
class select_union;
219
class st_select_lex_unit: public st_select_lex_node {
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
220 221 222 223 224 225 226 227 228 229
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,
230
    prepared, //prepare phase already performed for UNION (unit)
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
231
    optimized; // optimize phase already performed for UNION (unit)
232
public:
233 234 235 236 237 238 239
  /*
    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
240 241 242 243
  bool depended; /* depended from outer select subselect */
  /* not NULL if union used in subselect, point to subselect item */
  Item_subselect *item;

244
  void init_query();
245
  bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
246
  st_select_lex* outer_select() { return (st_select_lex*) master; }
247 248
  st_select_lex* first_select() { return (st_select_lex*) slave; }
  st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
249

bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
250 251 252 253 254
  /* UNION methods */
  int prepare(THD *thd, select_result *result);
  int exec();
  int cleanup();
  
255
  friend void mysql_init_query(THD *thd);
256 257 258
private:
  bool create_total_list_n_last_return(THD *thd, st_lex *lex,
				       TABLE_LIST ***result);
259
};
bell@sanja.is.com.ua's avatar
cleanup  
bell@sanja.is.com.ua committed
260
typedef class st_select_lex_unit SELECT_LEX_UNIT;
261 262 263 264

/*
  SELECT_LEX - store information of parsed SELECT_LEX statment
*/
265 266
class st_select_lex: public st_select_lex_node
{
267
public:
268 269
  char *db, *db1, *table1, *db2, *table2;      	/* For outer join using .. */
  Item *where, *having;                         /* WHERE & HAVING clauses */
270
  enum olap_type olap;
271
  List<List_item>     expr_list;
272 273 274 275
  List<List_item>     when_list;                /* WHEN clause */
  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
276
		      ignore_index, *ignore_index_ptr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
277 278 279 280 281 282
  /* 
    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
283
  JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
284
  const char *type; /* type of select for EXPLAIN */
285
  uint in_sum_expr;
bell@sanja.is.com.ua's avatar
bell@sanja.is.com.ua committed
286
  uint select_number; /* number of select (used for EXPLAIN) */
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
287 288 289 290 291
  bool	create_refs;
  bool  braces;   	/* SELECT ... UNION (SELECT ... ) <- this braces */
  bool depended;	/* depended from outer select subselect */
  /* TRUE when having fix field called in processing of this SELECT */
  bool having_fix_field;
292

293 294
  void init_query();
  void init_select();
295 296 297 298 299 300 301 302 303
  st_select_lex_unit* master_unit() { return (st_select_lex_unit*) master; }
  st_select_lex_unit* first_inner_unit() 
  { 
    return (st_select_lex_unit*) slave; 
  }
  st_select_lex* outer_select() 
  { 
    return (st_select_lex*) master_unit()->outer_select(); 
  }
304
  st_select_lex* next_select() { return (st_select_lex*) next; }
305 306 307 308 309 310 311 312 313 314
  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;
  }

  friend void mysql_init_query(THD *thd);
315
};
bell@sanja.is.com.ua's avatar
cleanup  
bell@sanja.is.com.ua committed
316
typedef class st_select_lex SELECT_LEX;
317 318


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

321 322
typedef struct st_lex
{
bk@work.mysql.com's avatar
bk@work.mysql.com committed
323 324
  uint	 yylineno,yytoklen;			/* Simulate lex */
  LEX_YYSTYPE yylval;
325 326 327 328
  SELECT_LEX_UNIT unit;                         /* most upper unit */
  SELECT_LEX select_lex,                        /* first SELECT_LEX */
    /* current SELECT_LEX in parsing */
    *select;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
329 330
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
331
  char *backup_dir;				/* For RESTORE/BACKUP */
332
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
333
  char* x509_subject,*x509_issuer,*ssl_cipher;
334
  enum SSL_type ssl_type;			/* defined in violite.h */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
335 336
  String *wild;
  sql_exchange *exchange;
337
  select_result *result;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
338 339

  List<key_part_spec> col_list;
340
  List<key_part_spec> ref_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
341 342
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
343
  List<String>	      interval_list;
344
  List<LEX_USER>      users_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
345 346 347
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
348 349
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
350
  List<set_var_base>  var_list;
351
  List<Item>          param_list;
352
  SQL_LIST	      proc_list, auxilliary_table_list;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
353 354
  TYPELIB	      *interval;
  create_field	      *last_field;
355
  Item *default_value, *comment;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
356
  CONVERT *convert_set;
357
  CONVERT *thd_convert_set;			// Set with SET CHAR SET
358
  LEX_USER *grant_user;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
359
  gptr yacc_yyss,yacc_yyvs;
360
  THD *thd;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
361
  udf_func udf;
362 363
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
sasha@mysql.sashanet.com's avatar
sasha@mysql.sashanet.com committed
364
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
365
  USER_RESOURCES mqh;
366 367
  ulong thread_id,type;
  enum_sql_command sql_command;
368
  thr_lock_type lock_option;
369 370
  enum lex_states next_state;
  enum enum_duplicates duplicates;
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
371
  enum enum_tx_isolation tx_isolation;
372 373
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
374
  enum enum_enable_or_disable alter_keys_onoff;
375
  enum enum_var_type option_type;
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
376
  uint grant, grant_tot_col, which_columns, union_option;
377
  uint fk_delete_opt, fk_update_opt, fk_match_option;
378
  uint param_count;
monty@narttu.mysql.fi's avatar
monty@narttu.mysql.fi committed
379 380
  bool drop_primary, drop_if_exists, local_file, olap;
  bool in_comment, ignore_space, verbose, simple_alter;
381
  bool derived_tables, describe;
382
  uint slave_thd_opt;
383
  CHARSET_INFO *charset;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
384 385 386 387 388 389 390 391 392 393 394 395 396
} 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)