sql_lex.h 12.2 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
// The following hack is needed because mysql_yacc.cc does not define
unknown's avatar
unknown committed
26 27 28 29 30 31 32 33 34 35 36
// YYSTYPE before including this file

#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 {
37 38 39 40 41
  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
42
  SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
43
  SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
44
  SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
unknown's avatar
unknown committed
45
  SQLCOM_SHOW_CREATE_DB,
46

unknown's avatar
unknown committed
47
  SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
48 49
  SQLCOM_GRANT, 
  SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,
50 51 52 53
  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,
unknown's avatar
unknown committed
54
  SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
55
  SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
unknown's avatar
unknown committed
56
  SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
57
  SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS,
58
  SQLCOM_SHOW_OPEN_TABLES, SQLCOM_LOAD_MASTER_DATA,
59
  SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
60
  SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_MULTI_UPDATE,
unknown's avatar
unknown committed
61
  SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
unknown's avatar
unknown committed
62 63 64 65
  SQLCOM_END, SQLCOM_SHOW_WARNS, SQLCOM_SHOW_WARNS_COUNT, 
  SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS, 
  SQLCOM_SHOW_ERRORS_COUNT, SQLCOM_SHOW_COLUMN_TYPES,
  SQLCOM_SHOW_TABLE_TYPES, SQLCOM_SHOW_PRIVILEGES
unknown's avatar
unknown committed
66 67 68 69 70 71 72 73
};

enum lex_states { STATE_START, STATE_CHAR, STATE_IDENT,
		  STATE_IDENT_SEP,
		  STATE_IDENT_START,
		  STATE_FOUND_IDENT,
		  STATE_SIGNED_NUMBER,
		  STATE_REAL,
74
		  STATE_HEX_NUMBER,
unknown's avatar
unknown committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
		  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,
		  STATE_HOSTNAME,
		  STATE_SKIP,
		  STATE_USER_VARIABLE_DELIMITER
};

typedef List<Item> List_item;

typedef struct st_lex_master_info
{
  char* host, *user, *password,*log_file_name;
  uint port, connect_retry;
  ulonglong pos;
unknown's avatar
unknown committed
104
  ulong server_id;
105 106
  char* relay_log_name;
  ulong relay_log_pos;
unknown's avatar
unknown committed
107 108
} LEX_MASTER_INFO;

109

unknown's avatar
unknown committed
110 111
enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
		      EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE};
112

unknown's avatar
unknown committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/* 
  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:
131

unknown's avatar
unknown committed
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 189 190 191 192
   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)
*/
193 194
class st_select_lex_node {
protected:
unknown's avatar
unknown committed
195 196 197
  st_select_lex_node *next, **prev,   /* neighbor list */
    *master, *slave,                  /* vertical links */
    *link_next, **link_prev;          /* list of whole SELECT_LEX */
198 199 200
public:
  ulong options;
  enum sub_select_type linkage;
unknown's avatar
unknown committed
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
  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
*/
217 218 219 220
class st_lex;
class st_select_lex;
class st_select_lex_unit: public st_select_lex_node {
public:
unknown's avatar
unknown committed
221 222 223 224 225 226 227 228
  /*
    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;
  void init_query();
229
  bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
230
  st_select_lex* outer_select() { return (st_select_lex*) master; }
231 232
  st_select_lex* first_select() { return (st_select_lex*) slave; }
  st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
233 234

  friend void mysql_init_query(THD *thd);
235 236 237
private:
  bool create_total_list_n_last_return(THD *thd, st_lex *lex,
				       TABLE_LIST ***result);
unknown's avatar
unknown committed
238
};
unknown's avatar
unknown committed
239
typedef class st_select_lex_unit SELECT_LEX_UNIT;
unknown's avatar
unknown committed
240 241 242 243

/*
  SELECT_LEX - store information of parsed SELECT_LEX statment
*/
unknown's avatar
unknown committed
244
class JOIN;
245 246
class st_select_lex: public st_select_lex_node {
public:
unknown's avatar
unknown committed
247 248
  char *db, *db1, *table1, *db2, *table2;      	/* For outer join using .. */
  Item *where, *having;                         /* WHERE & HAVING clauses */
249
  List<List_item>     expr_list;
unknown's avatar
unknown committed
250 251 252 253
  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,
unknown's avatar
unknown committed
254
		      ignore_index, *ignore_index_ptr;
255
  List<Item_func_match> ftfunc_list;
unknown's avatar
unknown committed
256
  JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
257
  uint in_sum_expr;
unknown's avatar
unknown committed
258
  bool	create_refs, 
259
    braces,   /* SELECT ... UNION (SELECT ... ) <- this braces */
unknown's avatar
unknown committed
260 261
    depended, /* depended from outer select subselect */
    /* TRUE when having fix field called in processing of this SELECT */
unknown's avatar
unknown committed
262
    having_fix_field;
unknown's avatar
unknown committed
263

unknown's avatar
unknown committed
264 265
  void init_query();
  void init_select();
266 267 268 269 270 271 272 273 274
  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(); 
  }
275
  st_select_lex* next_select() { return (st_select_lex*) next; }
276 277 278 279 280 281 282 283 284 285
  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);
unknown's avatar
unknown committed
286
};
unknown's avatar
unknown committed
287
typedef class st_select_lex SELECT_LEX;
288

unknown's avatar
unknown committed
289 290 291 292 293 294 295 296 297 298 299
class Set_option :public Sql_alloc {
public:
  const char *name;
  Item *item;
  uint name_length;
  bool type;					/* 1 if global */
  Set_option(bool par_type, const char *par_name, uint length,
	     Item *par_item)
    :name(par_name), item(par_item), name_length(length), type(par_type) {}
};

unknown's avatar
unknown committed
300 301 302 303 304
/* The state of the lex parsing. This is saved in the THD struct */

typedef struct st_lex {
  uint	 yylineno,yytoklen;			/* Simulate lex */
  LEX_YYSTYPE yylval;
unknown's avatar
unknown committed
305 306 307 308
  SELECT_LEX_UNIT unit;                         /* most upper unit */
  SELECT_LEX select_lex,                        /* first SELECT_LEX */
    /* current SELECT_LEX in parsing */
    *select;
unknown's avatar
unknown committed
309 310
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
311
  char *backup_dir;				/* For RESTORE/BACKUP */
unknown's avatar
unknown committed
312
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
313 314
  char* x509_subject,*x509_issuer,*ssl_cipher;
  enum SSL_type ssl_type; /* defined in violite.h */
unknown's avatar
unknown committed
315 316 317 318
  String *wild;
  sql_exchange *exchange;

  List<key_part_spec> col_list;
319
  List<key_part_spec> ref_list;
unknown's avatar
unknown committed
320 321
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
322
  List<String>	      interval_list;
unknown's avatar
unknown committed
323 324 325 326
  List<st_lex_user>   users_list;
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
327 328
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
unknown's avatar
unknown committed
329
  List<Set_option>    option_list;
unknown's avatar
unknown committed
330
  List<Item>          param_list;
331
  SQL_LIST	      proc_list, auxilliary_table_list;
unknown's avatar
unknown committed
332 333
  TYPELIB	      *interval;
  create_field	      *last_field;
334
  Item *default_value, *comment;
unknown's avatar
unknown committed
335
  CONVERT *convert_set;
336
  LEX_USER *grant_user;
unknown's avatar
unknown committed
337
  gptr yacc_yyss,yacc_yyvs;
unknown's avatar
unknown committed
338
  THD *thd;
unknown's avatar
unknown committed
339
  udf_func udf;
340 341
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
unknown's avatar
unknown committed
342
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
343
  USER_RESOURCES mqh;
344 345
  ulong thread_id,type;
  enum_sql_command sql_command;
346
  thr_lock_type lock_option;
347 348
  enum lex_states next_state;
  enum enum_duplicates duplicates;
unknown's avatar
unknown committed
349
  enum enum_tx_isolation tx_isolation;
350 351
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
352
  enum enum_enable_or_disable alter_keys_onoff;
unknown's avatar
unknown committed
353
  uint grant, grant_tot_col, which_columns, union_option;
354
  uint fk_delete_opt, fk_update_opt, fk_match_option;
355
  bool	drop_primary,drop_if_exists,local_file;
unknown's avatar
unknown committed
356
  bool  in_comment,ignore_space,verbose,simple_alter, option_type, derived_tables;
357
  uint slave_thd_opt;
358
  CHARSET_INFO *charset;
unknown's avatar
unknown committed
359 360 361 362 363 364 365 366 367 368 369 370 371
} 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)