sql_lex.h 6.2 KB
Newer Older
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
   
   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.
   
   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.
   
   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
bk@work.mysql.com's avatar
bk@work.mysql.com 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,
tim@cane.mysql.fi's avatar
tim@cane.mysql.fi 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,

bk@work.mysql.com's avatar
bk@work.mysql.com 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,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
52
  SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
53
  SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
monty@donna.mysql.com's avatar
monty@donna.mysql.com 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,
58
  SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_MULTI_DELETE,
59
  SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER
bk@work.mysql.com's avatar
bk@work.mysql.com committed
60 61 62 63 64 65 66 67
};

enum lex_states { STATE_START, STATE_CHAR, STATE_IDENT,
		  STATE_IDENT_SEP,
		  STATE_IDENT_START,
		  STATE_FOUND_IDENT,
		  STATE_SIGNED_NUMBER,
		  STATE_REAL,
68
		  STATE_HEX_NUMBER,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
69 70 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
		  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;
97
  ulong last_log_seq;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
98
  ulonglong pos;
99
  ulong server_id;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
100 101
} LEX_MASTER_INFO;

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, EXCEPT_TYPE};

/* 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;
monty@tik.mysql.fi's avatar
monty@tik.mysql.fi committed
117 118
  List<String>        interval_list,use_index, *use_index_ptr,
		      ignore_index, *ignore_index_ptr;
119 120 121 122 123 124 125
  List<Item_func_match> ftfunc_list;
  uint in_sum_expr, sort_default;
  bool	create_refs;
  st_select_lex *next;
} SELECT_LEX;


126 127 128 129 130 131 132 133 134 135 136 137
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) {}
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
138 139 140 141 142
/* 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;
143
  SELECT_LEX select_lex, *select;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
144 145
  uchar *ptr,*tok_start,*tok_end,*end_of_query;
  char *length,*dec,*change,*name;
146
  char *backup_dir;				/* For RESTORE/BACKUP */
147
  char* to_log;                                 /* For PURGE MASTER LOGS TO */
148 149
  char* x509_subject,*x509_issuer,*ssl_cipher;
  enum SSL_type ssl_type; /* defined in violite.h */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
150 151 152 153 154 155
  String *wild;
  sql_exchange *exchange;

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

bk@work.mysql.com's avatar
bk@work.mysql.com committed
189 190 191 192 193 194 195 196 197 198 199 200 201
} 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)