sql_lex.h 6.26 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 44 45
  SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
  SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE,

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

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

104

105
enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE, NOT_A_SELECT};
106 107 108 109 110 111 112 113 114 115 116 117 118

/* The state of the lex parsing for selects */

typedef struct st_select_lex {
  enum sub_select_type linkage;
  char *db,*db1,*table1,*db2,*table2;		/* For outer join using .. */
  Item *where,*having;
  ha_rows select_limit,offset_limit;
  ulong options;
  List<List_item>     expr_list;
  List<List_item>     when_list;
  SQL_LIST	      order_list,table_list,group_list;
  List<Item>          item_list;
unknown's avatar
unknown committed
119 120
  List<String>        interval_list,use_index, *use_index_ptr,
		      ignore_index, *ignore_index_ptr;
121 122
  List<Item_func_match> ftfunc_list;
  uint in_sum_expr, sort_default;
123
  bool	create_refs, braces;
124 125 126 127
  st_select_lex *next;
} SELECT_LEX;


unknown's avatar
unknown committed
128 129 130 131 132 133 134 135 136 137 138 139
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
140 141 142 143 144
/* 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;
145
  SELECT_LEX select_lex, *select;
unknown's avatar
unknown committed
146 147
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
148
  char *backup_dir;				/* For RESTORE/BACKUP */
unknown's avatar
unknown committed
149
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
150 151
  char* x509_subject,*x509_issuer,*ssl_cipher;
  enum SSL_type ssl_type; /* defined in violite.h */
unknown's avatar
unknown committed
152 153 154 155 156 157
  String *wild;
  sql_exchange *exchange;

  List<key_part_spec> col_list;
  List<Alter_drop>    drop_list;
  List<Alter_column>  alter_list;
158
  List<String>	      interval_list;
unknown's avatar
unknown committed
159 160 161 162
  List<st_lex_user>   users_list;
  List<LEX_COLUMN>    columns;
  List<Key>	      key_list;
  List<create_field>  create_list;
163 164
  List<Item>	      *insert_list,field_list,value_list;
  List<List_item>     many_values;
unknown's avatar
unknown committed
165
  List<Set_option>    option_list;
166
  SQL_LIST	      proc_list, auxilliary_table_list;
unknown's avatar
unknown committed
167 168
  TYPELIB	      *interval;
  create_field	      *last_field;
169
  Item *default_value;
unknown's avatar
unknown committed
170
  CONVERT *convert_set;
171
  LEX_USER *grant_user;
unknown's avatar
unknown committed
172
  gptr yacc_yyss,yacc_yyvs;
unknown's avatar
unknown committed
173
  THD *thd;
unknown's avatar
unknown committed
174
  udf_func udf;
175 176
  HA_CHECK_OPT   check_opt;			// check/repair options
  HA_CREATE_INFO create_info;
unknown's avatar
unknown committed
177
  LEX_MASTER_INFO mi;				// used by CHANGE MASTER
178 179 180 181
  ulong thread_id,type;
  enum_sql_command sql_command;
  enum lex_states next_state;
  enum enum_duplicates duplicates;
unknown's avatar
unknown committed
182
  enum enum_tx_isolation tx_isolation;
183 184
  enum enum_ha_read_modes ha_read_mode;
  enum ha_rkey_function ha_rkey_mode;
185
  enum enum_enable_or_disable alter_keys_onoff;
unknown's avatar
unknown committed
186
  uint grant,grant_tot_col,which_columns, union_option;
187
  thr_lock_type lock_option;
188
  bool	drop_primary,drop_if_exists,local_file;
unknown's avatar
unknown committed
189
  bool  in_comment,ignore_space,verbose,simple_alter, option_type;
190

unknown's avatar
unknown committed
191 192 193 194 195 196 197 198 199 200 201 202 203
} 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)