2000-07-31 21:29:14 +02:00
|
|
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
2001-12-06 13:10:51 +01:00
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
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.
|
2001-12-06 13:10:51 +01:00
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
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.
|
2001-12-06 13:10:51 +01:00
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
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;
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
/*
|
|
|
|
The following hack is needed because mysql_yacc.cc does not define
|
|
|
|
YYSTYPE before including this file
|
|
|
|
*/
|
2000-07-31 21:29:14 +02:00
|
|
|
|
2002-07-23 17:31:22 +02:00
|
|
|
#include "set_var.h"
|
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
#ifdef MYSQL_YACC
|
|
|
|
#define LEX_YYSTYPE void *
|
|
|
|
#else
|
|
|
|
#include "lex_symbol.h"
|
|
|
|
#include "sql_yacc.h"
|
|
|
|
#define LEX_YYSTYPE YYSTYPE *
|
|
|
|
#endif
|
|
|
|
|
2002-11-29 14:20:25 +01:00
|
|
|
/*
|
|
|
|
When a command is added here, be sure it's also added in mysqld.cc
|
|
|
|
in "struct show_var_st status_vars[]= {" ...
|
|
|
|
*/
|
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
enum enum_sql_command {
|
2000-11-13 22:55:10 +01:00
|
|
|
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,
|
2000-12-15 12:18:52 +01:00
|
|
|
SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS,
|
2002-07-08 18:34:49 +02:00
|
|
|
SQLCOM_SHOW_INNODB_STATUS,
|
2000-11-13 22:55:10 +01:00
|
|
|
SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
|
2002-06-11 14:40:06 +02:00
|
|
|
SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
|
2003-03-25 10:38:05 +01:00
|
|
|
SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB,
|
2000-11-13 22:55:10 +01:00
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
|
2002-11-29 12:29:27 +01:00
|
|
|
SQLCOM_GRANT,
|
2002-06-27 11:41:02 +02:00
|
|
|
SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,
|
2002-11-29 12:29:27 +01:00
|
|
|
SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,
|
2000-11-13 22:55:10 +01:00
|
|
|
SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
|
2003-07-16 21:30:49 +02:00
|
|
|
SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
|
|
|
|
SQLCOM_ASSIGN_TO_KEYCACHE, SQLCOM_PRELOAD_KEYS,
|
2003-08-21 16:15:06 +02:00
|
|
|
SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
|
2003-06-15 00:04:28 +02:00
|
|
|
SQLCOM_ROLLBACK, SQLCOM_ROLLBACK_TO_SAVEPOINT,
|
|
|
|
SQLCOM_COMMIT, SQLCOM_SAVEPOINT,
|
2003-06-06 03:18:58 +02:00
|
|
|
SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
|
2000-11-13 22:55:10 +01:00
|
|
|
SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
|
2000-10-14 10:16:17 +02:00
|
|
|
SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
|
2003-02-16 17:39:12 +01:00
|
|
|
SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_PURGE_BEFORE, SQLCOM_SHOW_BINLOGS,
|
2001-05-29 03:18:23 +02:00
|
|
|
SQLCOM_SHOW_OPEN_TABLES, SQLCOM_LOAD_MASTER_DATA,
|
2001-05-31 02:50:56 +02:00
|
|
|
SQLCOM_HA_OPEN, SQLCOM_HA_CLOSE, SQLCOM_HA_READ,
|
2002-11-29 12:29:27 +01:00
|
|
|
SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
|
2001-12-17 22:24:51 +01:00
|
|
|
SQLCOM_SHOW_BINLOG_EVENTS, SQLCOM_SHOW_NEW_MASTER, SQLCOM_DO,
|
2002-08-30 11:40:40 +02:00
|
|
|
SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
|
2003-12-17 23:52:03 +01:00
|
|
|
SQLCOM_SHOW_COLUMN_TYPES, SQLCOM_SHOW_STORAGE_ENGINES, SQLCOM_SHOW_PRIVILEGES,
|
2003-08-21 16:15:06 +02:00
|
|
|
SQLCOM_HELP, SQLCOM_DROP_USER, SQLCOM_REVOKE_ALL, SQLCOM_CHECKSUM,
|
2002-11-29 14:20:25 +01:00
|
|
|
|
|
|
|
/* This should be the last !!! */
|
|
|
|
SQLCOM_END
|
2000-07-31 21:29:14 +02:00
|
|
|
};
|
|
|
|
|
2003-10-16 14:54:47 +02:00
|
|
|
// describe/explain types
|
|
|
|
#define DESCRIBE_NORMAL 1
|
|
|
|
#define DESCRIBE_EXTENDED 2
|
|
|
|
|
2003-11-17 19:53:40 +01:00
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
typedef List<Item> List_item;
|
|
|
|
|
|
|
|
typedef struct st_lex_master_info
|
|
|
|
{
|
2002-06-11 10:20:31 +02:00
|
|
|
char *host, *user, *password, *log_file_name;
|
2000-07-31 21:29:14 +02:00
|
|
|
uint port, connect_retry;
|
|
|
|
ulonglong pos;
|
2001-07-05 01:14:31 +02:00
|
|
|
ulong server_id;
|
2003-09-01 13:16:20 +02:00
|
|
|
/*
|
|
|
|
Variable for MASTER_SSL option.
|
|
|
|
MASTER_SSL=0 in CHANGE MASTER TO corresponds to SSL_DISABLE
|
|
|
|
MASTER_SSL=1 corresponds to SSL_ENABLE
|
|
|
|
*/
|
|
|
|
enum {SSL_UNCHANGED=0, SSL_DISABLE, SSL_ENABLE} ssl;
|
|
|
|
char *ssl_key, *ssl_cert, *ssl_ca, *ssl_capath, *ssl_cipher;
|
2002-06-11 10:20:31 +02:00
|
|
|
char *relay_log_name;
|
2002-03-16 02:44:44 +01:00
|
|
|
ulong relay_log_pos;
|
2000-07-31 21:29:14 +02:00
|
|
|
} LEX_MASTER_INFO;
|
|
|
|
|
2001-06-03 16:07:26 +02:00
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
enum sub_select_type
|
|
|
|
{
|
2002-08-30 11:40:40 +02:00
|
|
|
UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
|
|
|
|
EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE, OLAP_TYPE
|
2002-07-16 21:42:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
enum olap_type
|
|
|
|
{
|
2002-07-24 18:55:08 +02:00
|
|
|
UNSPECIFIED_OLAP_TYPE, CUBE_TYPE, ROLLUP_TYPE
|
2002-06-11 10:20:31 +02:00
|
|
|
};
|
2001-06-03 16:07:26 +02:00
|
|
|
|
2003-10-13 10:20:19 +02:00
|
|
|
enum tablespace_op_type
|
|
|
|
{
|
|
|
|
NO_TABLESPACE_OP, DISCARD_TABLESPACE, IMPORT_TABLESPACE
|
|
|
|
};
|
|
|
|
|
2002-05-06 23:04:16 +02:00
|
|
|
/*
|
|
|
|
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)
|
2003-07-03 01:30:52 +02:00
|
|
|
- if unit contain several selects (union) then it have special
|
|
|
|
select_lex called fake_select_lex. It used for storing global parameters
|
|
|
|
and executing union. subqueries of global ORDER BY clause will be
|
|
|
|
attached to this fake_select_lex, which will allow them correctly
|
|
|
|
resolve fields of 'upper' union and other more outer selects.
|
|
|
|
|
2002-05-06 23:04:16 +02:00
|
|
|
for example for following query:
|
2001-06-03 16:07:26 +02:00
|
|
|
|
2002-05-06 23:04:16 +02:00
|
|
|
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
|
2003-07-03 01:30:52 +02:00
|
|
|
fake0
|
2002-05-06 23:04:16 +02:00
|
|
|
select1 select2 select3
|
|
|
|
|^^ |^
|
|
|
|
s||| ||master
|
|
|
|
l||| |+---------------------------------+
|
|
|
|
a||| +---------------------------------+|
|
|
|
|
v|||master slave ||
|
|
|
|
e||+-------------------------+ ||
|
|
|
|
V| neighbor | V|
|
2003-07-03 01:30:52 +02:00
|
|
|
unit1.1<+==================>unit1.2 unit2.1
|
|
|
|
fake1.1 fake2.1
|
2002-05-06 23:04:16 +02:00
|
|
|
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
|
2003-07-03 01:30:52 +02:00
|
|
|
|^^^^|fake_select_lex
|
|
|
|
|||||+--------------------------------------------+
|
|
|
|
||||+--------------------------------------------+|
|
|
|
|
|||+------------------------------+ ||
|
|
|
|
||+--------------+ | ||
|
|
|
|
slave||master | | ||
|
|
|
|
V| neighbor | neighbor | master|V
|
|
|
|
select1<========>select2<========>select3 fake0
|
2002-05-06 23:04:16 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
*/
|
2002-12-15 21:01:09 +01:00
|
|
|
struct st_lex;
|
2002-10-30 12:18:52 +01:00
|
|
|
class st_select_lex;
|
|
|
|
class st_select_lex_unit;
|
2002-05-27 19:52:54 +02:00
|
|
|
class st_select_lex_node {
|
|
|
|
protected:
|
2002-05-06 23:04:16 +02:00
|
|
|
st_select_lex_node *next, **prev, /* neighbor list */
|
|
|
|
*master, *slave, /* vertical links */
|
|
|
|
*link_next, **link_prev; /* list of whole SELECT_LEX */
|
2002-05-27 19:52:54 +02:00
|
|
|
public:
|
2003-05-17 09:05:07 +02:00
|
|
|
enum enum_parsing_place
|
|
|
|
{
|
|
|
|
NO_MATTER,
|
|
|
|
IN_HAVING,
|
|
|
|
SELECT_LIST
|
|
|
|
};
|
|
|
|
|
2002-05-27 19:52:54 +02:00
|
|
|
ulong options;
|
2003-11-17 19:53:40 +01:00
|
|
|
/*
|
|
|
|
result of this query can't be cached, bit field, can be :
|
|
|
|
UNCACHEABLE_DEPENDENT
|
|
|
|
UNCACHEABLE_RAND
|
2003-11-18 21:04:01 +01:00
|
|
|
UNCACHEABLE_SIDEEFFECT
|
2003-11-17 19:53:40 +01:00
|
|
|
*/
|
|
|
|
uint8 uncacheable;
|
2001-06-03 16:07:26 +02:00
|
|
|
enum sub_select_type linkage;
|
2003-01-14 17:00:34 +01:00
|
|
|
bool no_table_names_allowed; /* used for global order by */
|
2003-06-25 00:19:09 +02:00
|
|
|
bool no_error; /* suppress error message (convert it to warnings) */
|
2002-10-30 12:18:52 +01:00
|
|
|
|
|
|
|
static void *operator new(size_t size)
|
|
|
|
{
|
2003-03-05 22:32:59 +01:00
|
|
|
return (void*) sql_alloc((uint) size);
|
2002-10-30 12:18:52 +01:00
|
|
|
}
|
2003-08-18 23:08:08 +02:00
|
|
|
static void *operator new(size_t size, MEM_ROOT *mem_root)
|
|
|
|
{ return (void*) alloc_root(mem_root, (uint) size); }
|
2002-10-30 12:18:52 +01:00
|
|
|
static void operator delete(void *ptr,size_t size) {}
|
2003-02-14 10:47:41 +01:00
|
|
|
st_select_lex_node(): linkage(UNSPECIFIED_TYPE) {}
|
2002-10-30 12:18:52 +01:00
|
|
|
virtual ~st_select_lex_node() {}
|
|
|
|
inline st_select_lex_node* get_master() { return master; }
|
|
|
|
virtual void init_query();
|
|
|
|
virtual void init_select();
|
2002-05-06 23:04:16 +02:00
|
|
|
void include_down(st_select_lex_node *upper);
|
|
|
|
void include_neighbour(st_select_lex_node *before);
|
2003-07-03 01:30:52 +02:00
|
|
|
void include_standalone(st_select_lex_node *sel, st_select_lex_node **ref);
|
2002-05-06 23:04:16 +02:00
|
|
|
void include_global(st_select_lex_node **plink);
|
|
|
|
void exclude();
|
2002-10-30 12:18:52 +01:00
|
|
|
|
|
|
|
virtual st_select_lex_unit* master_unit()= 0;
|
|
|
|
virtual st_select_lex* outer_select()= 0;
|
2003-07-03 01:30:52 +02:00
|
|
|
virtual st_select_lex* return_after_parsing()= 0;
|
2002-10-30 12:18:52 +01:00
|
|
|
|
|
|
|
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();
|
2003-01-09 21:42:31 +01:00
|
|
|
virtual ulong get_table_join_options();
|
2002-12-06 20:11:27 +01:00
|
|
|
virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table,
|
2002-10-30 12:18:52 +01:00
|
|
|
LEX_STRING *alias,
|
2003-01-09 02:55:26 +01:00
|
|
|
ulong table_options,
|
2002-10-30 12:18:52 +01:00
|
|
|
thr_lock_type flags= TL_UNLOCK,
|
|
|
|
List<String> *use_index= 0,
|
2003-07-16 21:30:49 +02:00
|
|
|
List<String> *ignore_index= 0,
|
|
|
|
LEX_STRING *option= 0);
|
2002-11-21 21:25:53 +01:00
|
|
|
virtual void set_lock_for_tables(thr_lock_type lock_type) {}
|
2003-07-02 00:45:22 +02:00
|
|
|
|
2002-11-28 18:29:26 +01:00
|
|
|
friend class st_select_lex_unit;
|
2002-12-15 21:01:09 +01:00
|
|
|
friend bool mysql_new_select(struct st_lex *lex, bool move_down);
|
2002-05-06 23:04:16 +02:00
|
|
|
private:
|
|
|
|
void fast_exclude();
|
|
|
|
};
|
2002-10-30 12:18:52 +01:00
|
|
|
typedef class st_select_lex_node SELECT_LEX_NODE;
|
2002-05-06 23:04:16 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group
|
|
|
|
SELECT_LEXs
|
|
|
|
*/
|
2002-10-08 21:28:24 +02:00
|
|
|
struct st_lex;
|
2002-09-03 08:50:36 +02:00
|
|
|
class THD;
|
|
|
|
class select_result;
|
|
|
|
class JOIN;
|
|
|
|
class select_union;
|
2002-05-27 19:52:54 +02:00
|
|
|
class st_select_lex_unit: public st_select_lex_node {
|
2002-09-03 08:50:36 +02:00
|
|
|
protected:
|
|
|
|
TABLE_LIST result_table_list;
|
|
|
|
select_union *union_result;
|
|
|
|
TABLE *table; /* temporary table using for appending UNION results */
|
2003-01-25 01:25:52 +01:00
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
select_result *result;
|
|
|
|
int res;
|
2003-11-04 11:51:01 +01:00
|
|
|
ulong found_rows_for_union;
|
2003-08-23 20:21:02 +02:00
|
|
|
bool prepared, // prepare phase already performed for UNION (unit)
|
2002-10-27 20:29:40 +01:00
|
|
|
optimized, // optimize phase already performed for UNION (unit)
|
2003-11-23 01:01:15 +01:00
|
|
|
executed; // already executed
|
|
|
|
|
2002-05-27 19:52:54 +02:00
|
|
|
public:
|
2003-11-23 01:01:15 +01:00
|
|
|
// list of fields which points to temporary table for union
|
|
|
|
List<Item> item_list;
|
2003-11-23 20:26:43 +01:00
|
|
|
/*
|
|
|
|
list of types of items inside union (used for union & derived tables)
|
|
|
|
|
|
|
|
Item_type_holders from which this list consist may have pointers to Field,
|
|
|
|
pointers is valid only after preparing SELECTS of this unit and before
|
|
|
|
any SELECT of this unit execution
|
|
|
|
*/
|
2003-11-23 01:01:15 +01:00
|
|
|
List<Item> types;
|
2002-05-06 23:04:16 +02:00
|
|
|
/*
|
|
|
|
Pointer to 'last' select or pointer to unit where stored
|
|
|
|
global parameters for union
|
|
|
|
*/
|
2003-07-03 01:30:52 +02:00
|
|
|
st_select_lex *global_parameters;
|
2003-03-11 00:06:28 +01:00
|
|
|
//node on wich we should return current_select pointer after parsing subquery
|
2003-07-03 01:30:52 +02:00
|
|
|
st_select_lex *return_to;
|
2002-05-06 23:04:16 +02:00
|
|
|
/* LIMIT clause runtime counters */
|
|
|
|
ha_rows select_limit_cnt, offset_limit_cnt;
|
2003-07-07 17:40:19 +02:00
|
|
|
/* not NULL if unit used in subselect, point to subselect item */
|
2002-09-03 08:50:36 +02:00
|
|
|
Item_subselect *item;
|
2003-07-03 01:30:52 +02:00
|
|
|
/* thread handler */
|
2003-01-25 01:25:52 +01:00
|
|
|
THD *thd;
|
2003-07-03 01:30:52 +02:00
|
|
|
/* fake SELECT_LEX for union processing */
|
|
|
|
st_select_lex *fake_select_lex;
|
2003-01-25 01:25:52 +01:00
|
|
|
|
2002-10-26 19:18:37 +02:00
|
|
|
uint union_option;
|
2002-09-03 08:50:36 +02:00
|
|
|
|
2002-05-06 23:04:16 +02:00
|
|
|
void init_query();
|
2004-02-01 14:30:32 +01:00
|
|
|
bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
|
2002-10-30 12:18:52 +01:00
|
|
|
st_select_lex_unit* master_unit();
|
|
|
|
st_select_lex* outer_select();
|
2002-05-26 21:50:32 +02:00
|
|
|
st_select_lex* first_select() { return (st_select_lex*) slave; }
|
2003-03-06 16:02:10 +01:00
|
|
|
st_select_lex* first_select_in_union()
|
|
|
|
{
|
2003-07-03 01:30:52 +02:00
|
|
|
return (st_select_lex*) slave;
|
2003-03-06 16:02:10 +01:00
|
|
|
}
|
2002-05-26 21:50:32 +02:00
|
|
|
st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
|
2003-07-03 01:30:52 +02:00
|
|
|
st_select_lex* return_after_parsing() { return return_to; }
|
2003-01-21 20:07:59 +01:00
|
|
|
void exclude_level();
|
2003-10-17 14:18:57 +02:00
|
|
|
void exclude_tree();
|
2002-05-27 19:52:54 +02:00
|
|
|
|
2002-09-03 08:50:36 +02:00
|
|
|
/* UNION methods */
|
2003-12-10 21:46:14 +01:00
|
|
|
int prepare(THD *thd, select_result *result, ulong additional_options);
|
2002-09-03 08:50:36 +02:00
|
|
|
int exec();
|
|
|
|
int cleanup();
|
2003-10-16 14:54:47 +02:00
|
|
|
|
2004-02-01 14:30:32 +01:00
|
|
|
bool check_updateable(char *db, char *table);
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(String *str);
|
2004-02-01 14:30:32 +01:00
|
|
|
|
2003-10-16 14:54:47 +02:00
|
|
|
|
2002-05-27 19:52:54 +02:00
|
|
|
friend void mysql_init_query(THD *thd);
|
2002-11-24 20:10:52 +01:00
|
|
|
friend int subselect_union_engine::exec();
|
2002-05-09 14:23:57 +02:00
|
|
|
private:
|
|
|
|
bool create_total_list_n_last_return(THD *thd, st_lex *lex,
|
2004-02-01 14:30:32 +01:00
|
|
|
TABLE_LIST ***result);
|
2002-05-06 23:04:16 +02:00
|
|
|
};
|
2002-07-05 07:15:57 +02:00
|
|
|
typedef class st_select_lex_unit SELECT_LEX_UNIT;
|
2002-05-06 23:04:16 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
SELECT_LEX - store information of parsed SELECT_LEX statment
|
|
|
|
*/
|
2002-10-02 12:33:08 +02:00
|
|
|
class st_select_lex: public st_select_lex_node
|
|
|
|
{
|
2002-05-27 19:52:54 +02:00
|
|
|
public:
|
2002-05-06 23:04:16 +02:00
|
|
|
char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */
|
|
|
|
Item *where, *having; /* WHERE & HAVING clauses */
|
2003-09-02 18:56:55 +02:00
|
|
|
Item *prep_where; /* saved WHERE clause for prepared statement processing */
|
2002-07-16 21:42:53 +02:00
|
|
|
enum olap_type olap;
|
2002-05-06 23:04:16 +02:00
|
|
|
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,
|
2001-08-02 05:29:50 +02:00
|
|
|
ignore_index, *ignore_index_ptr;
|
2002-09-03 08:50:36 +02:00
|
|
|
/*
|
|
|
|
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;
|
2002-07-01 18:06:24 +02:00
|
|
|
JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
|
2002-09-26 22:08:22 +02:00
|
|
|
const char *type; /* type of select for EXPLAIN */
|
2003-07-03 01:30:52 +02:00
|
|
|
|
|
|
|
SQL_LIST order_list; /* ORDER clause */
|
|
|
|
List<List_item> expr_list;
|
|
|
|
List<List_item> when_list; /* WHEN clause (expression) */
|
|
|
|
ha_rows select_limit, offset_limit; /* LIMIT clause parameters */
|
|
|
|
// Arrays of pointers to top elements of all_fields list
|
|
|
|
Item **ref_pointer_array;
|
|
|
|
|
2003-08-05 08:56:21 +02:00
|
|
|
/*
|
|
|
|
number of items in select_list and HAVING clause used to get number
|
|
|
|
bigger then can be number of entries that will be added to all item
|
|
|
|
list during split_sum_func
|
|
|
|
*/
|
|
|
|
uint select_n_having_items;
|
2003-07-03 01:30:52 +02:00
|
|
|
uint cond_count; /* number of arguments of and/or/xor in where/having */
|
|
|
|
enum_parsing_place parsing_place; /* where we are parsing expression */
|
|
|
|
bool with_sum_func; /* sum function indicator */
|
|
|
|
|
2003-01-09 02:55:26 +01:00
|
|
|
ulong table_join_options;
|
2002-05-27 19:52:54 +02:00
|
|
|
uint in_sum_expr;
|
2002-09-26 22:08:22 +02:00
|
|
|
uint select_number; /* number of select (used for EXPLAIN) */
|
2003-01-25 01:25:52 +01:00
|
|
|
uint with_wild; /* item list contain '*' */
|
2002-08-30 11:40:40 +02:00
|
|
|
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
|
|
|
|
/* TRUE when having fix field called in processing of this SELECT */
|
|
|
|
bool having_fix_field;
|
2003-07-29 15:59:46 +02:00
|
|
|
|
2003-05-21 22:35:51 +02:00
|
|
|
/*
|
2003-07-29 15:59:46 +02:00
|
|
|
SELECT for SELECT command st_select_lex. Used to privent scaning
|
|
|
|
item_list of non-SELECT st_select_lex (no sense find to finding
|
|
|
|
reference in it (all should be in tables, it is dangerouse due
|
|
|
|
to order of fix_fields calling for non-SELECTs commands (item list
|
|
|
|
can be not fix_fieldsd)). This value will be assigned for
|
|
|
|
primary select (sql_yac.yy) and for any subquery and
|
|
|
|
UNION SELECT (sql_parse.cc mysql_new_select())
|
|
|
|
|
|
|
|
|
|
|
|
INSERT for primary st_select_lex structure of simple INSERT/REPLACE
|
2003-05-21 22:35:51 +02:00
|
|
|
(used for name resolution, see Item_fiels & Item_ref fix_fields,
|
|
|
|
FALSE for INSERT/REPLACE ... SELECT, because it's
|
|
|
|
st_select_lex->table_list will be preprocessed (first table removed)
|
|
|
|
before passing to handle_select)
|
2003-07-29 15:59:46 +02:00
|
|
|
|
|
|
|
NOMATTER for other
|
2003-05-21 22:35:51 +02:00
|
|
|
*/
|
2003-07-29 15:59:46 +02:00
|
|
|
enum {NOMATTER_MODE, SELECT_MODE, INSERT_MODE} resolve_mode;
|
|
|
|
|
2002-07-01 13:14:51 +02:00
|
|
|
|
2002-05-06 23:04:16 +02:00
|
|
|
void init_query();
|
|
|
|
void init_select();
|
2002-10-30 12:18:52 +01:00
|
|
|
st_select_lex_unit* master_unit();
|
2002-05-27 19:52:54 +02:00
|
|
|
st_select_lex_unit* first_inner_unit()
|
|
|
|
{
|
|
|
|
return (st_select_lex_unit*) slave;
|
|
|
|
}
|
2002-10-30 12:18:52 +01:00
|
|
|
st_select_lex* outer_select();
|
2002-05-26 21:50:32 +02:00
|
|
|
st_select_lex* next_select() { return (st_select_lex*) next; }
|
2002-11-13 10:59:03 +01:00
|
|
|
st_select_lex* next_select_in_list()
|
2002-05-27 19:52:54 +02:00
|
|
|
{
|
|
|
|
return (st_select_lex*) link_next;
|
|
|
|
}
|
|
|
|
st_select_lex_node** next_select_in_list_addr()
|
|
|
|
{
|
|
|
|
return &link_next;
|
|
|
|
}
|
2003-07-03 01:30:52 +02:00
|
|
|
st_select_lex* return_after_parsing()
|
2003-03-11 00:06:28 +01:00
|
|
|
{
|
|
|
|
return master_unit()->return_after_parsing();
|
|
|
|
}
|
2002-05-27 19:52:54 +02:00
|
|
|
|
2003-07-03 01:30:52 +02:00
|
|
|
void mark_as_dependent(st_select_lex *last);
|
|
|
|
|
2002-10-30 12:18:52 +01:00
|
|
|
bool set_braces(bool value);
|
|
|
|
bool inc_in_sum_expr();
|
|
|
|
uint get_in_sum_expr();
|
2002-11-04 21:12:45 +01:00
|
|
|
|
2002-12-06 20:11:27 +01:00
|
|
|
bool add_item_to_list(THD *thd, Item *item);
|
|
|
|
bool add_group_to_list(THD *thd, Item *item, bool asc);
|
2002-10-30 12:18:52 +01:00
|
|
|
bool add_ftfunc_to_list(Item_func_match *func);
|
2003-07-03 01:30:52 +02:00
|
|
|
bool add_order_to_list(THD *thd, Item *item, bool asc);
|
2002-12-06 20:11:27 +01:00
|
|
|
TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table,
|
2002-10-30 12:18:52 +01:00
|
|
|
LEX_STRING *alias,
|
2003-01-09 02:55:26 +01:00
|
|
|
ulong table_options,
|
2002-10-30 12:18:52 +01:00
|
|
|
thr_lock_type flags= TL_UNLOCK,
|
|
|
|
List<String> *use_index= 0,
|
2003-08-27 00:14:13 +02:00
|
|
|
List<String> *ignore_index= 0,
|
|
|
|
LEX_STRING *option= 0);
|
2003-07-03 01:30:52 +02:00
|
|
|
TABLE_LIST* get_table_list();
|
|
|
|
List<Item>* get_item_list();
|
|
|
|
List<String>* get_use_index();
|
|
|
|
List<String>* get_ignore_index();
|
|
|
|
ulong get_table_join_options();
|
2002-11-21 21:25:53 +01:00
|
|
|
void set_lock_for_tables(thr_lock_type lock_type);
|
2002-11-05 00:10:05 +01:00
|
|
|
inline void init_order()
|
|
|
|
{
|
|
|
|
order_list.elements= 0;
|
|
|
|
order_list.first= 0;
|
|
|
|
order_list.next= (byte**) &order_list.first;
|
|
|
|
}
|
2002-10-30 12:18:52 +01:00
|
|
|
|
2003-07-03 01:30:52 +02:00
|
|
|
bool test_limit();
|
|
|
|
|
2002-05-27 19:52:54 +02:00
|
|
|
friend void mysql_init_query(THD *thd);
|
2003-07-03 01:30:52 +02:00
|
|
|
st_select_lex() {}
|
|
|
|
void make_empty_select()
|
2003-03-06 16:02:10 +01:00
|
|
|
{
|
|
|
|
init_query();
|
|
|
|
init_select();
|
|
|
|
}
|
2003-08-16 12:26:48 +02:00
|
|
|
bool setup_ref_array(THD *thd, uint order_group_num);
|
2004-02-01 14:30:32 +01:00
|
|
|
bool check_updateable(char *db, char *table);
|
2003-10-16 14:54:47 +02:00
|
|
|
void print(THD *thd, String *str);
|
|
|
|
static void print_order(String *str, ORDER *order);
|
|
|
|
void print_limit(THD *thd, String *str);
|
2002-05-06 23:04:16 +02:00
|
|
|
};
|
2002-07-05 07:15:57 +02:00
|
|
|
typedef class st_select_lex SELECT_LEX;
|
2001-06-03 16:07:26 +02:00
|
|
|
|
|
|
|
|
2000-07-31 21:29:14 +02:00
|
|
|
/* The state of the lex parsing. This is saved in the THD struct */
|
|
|
|
|
2002-06-11 10:20:31 +02:00
|
|
|
typedef struct st_lex
|
|
|
|
{
|
2000-07-31 21:29:14 +02:00
|
|
|
uint yylineno,yytoklen; /* Simulate lex */
|
|
|
|
LEX_YYSTYPE yylval;
|
2002-05-06 23:04:16 +02:00
|
|
|
SELECT_LEX_UNIT unit; /* most upper unit */
|
2002-10-30 12:18:52 +01:00
|
|
|
SELECT_LEX select_lex; /* first SELECT_LEX */
|
|
|
|
/* current SELECT_LEX in parsing */
|
2003-07-03 01:30:52 +02:00
|
|
|
SELECT_LEX *current_select;
|
2002-11-27 00:12:16 +01:00
|
|
|
/* list of all SELECT_LEX */
|
|
|
|
SELECT_LEX *all_selects_list;
|
2000-07-31 21:29:14 +02:00
|
|
|
uchar *ptr,*tok_start,*tok_end,*end_of_query;
|
|
|
|
char *length,*dec,*change,*name;
|
2003-08-05 21:14:15 +02:00
|
|
|
char *help_arg;
|
2000-09-16 18:06:21 +02:00
|
|
|
char *backup_dir; /* For RESTORE/BACKUP */
|
2000-10-27 06:11:55 +02:00
|
|
|
char* to_log; /* For PURGE MASTER LOGS TO */
|
2003-02-16 17:39:12 +01:00
|
|
|
time_t purge_time; /* For PURGE MASTER LOGS BEFORE */
|
2001-09-30 04:46:20 +02:00
|
|
|
char* x509_subject,*x509_issuer,*ssl_cipher;
|
2003-01-18 20:53:38 +01:00
|
|
|
char* found_colon; /* For multi queries - next query */
|
2000-07-31 21:29:14 +02:00
|
|
|
String *wild;
|
|
|
|
sql_exchange *exchange;
|
2002-10-16 15:55:08 +02:00
|
|
|
select_result *result;
|
2003-09-16 09:14:40 +02:00
|
|
|
Item *default_value;
|
2003-11-18 12:47:27 +01:00
|
|
|
LEX_STRING *comment, name_and_length;
|
2003-08-05 21:14:15 +02:00
|
|
|
LEX_USER *grant_user;
|
|
|
|
gptr yacc_yyss,yacc_yyvs;
|
|
|
|
THD *thd;
|
|
|
|
CHARSET_INFO *charset;
|
|
|
|
SQL_LIST *gorder_list;
|
2000-07-31 21:29:14 +02:00
|
|
|
|
|
|
|
List<key_part_spec> col_list;
|
2002-06-02 20:22:20 +02:00
|
|
|
List<key_part_spec> ref_list;
|
2000-07-31 21:29:14 +02:00
|
|
|
List<Alter_drop> drop_list;
|
|
|
|
List<Alter_column> alter_list;
|
2001-06-03 16:07:26 +02:00
|
|
|
List<String> interval_list;
|
2002-07-23 17:31:22 +02:00
|
|
|
List<LEX_USER> users_list;
|
2000-07-31 21:29:14 +02:00
|
|
|
List<LEX_COLUMN> columns;
|
|
|
|
List<Key> key_list;
|
|
|
|
List<create_field> create_list;
|
2001-06-03 16:07:26 +02:00
|
|
|
List<Item> *insert_list,field_list,value_list;
|
|
|
|
List<List_item> many_values;
|
2002-07-23 17:31:22 +02:00
|
|
|
List<set_var_base> var_list;
|
2002-06-12 23:13:12 +02:00
|
|
|
List<Item> param_list;
|
2003-07-03 10:55:36 +02:00
|
|
|
SQL_LIST proc_list, auxilliary_table_list, save_list;
|
2000-07-31 21:29:14 +02:00
|
|
|
TYPELIB *interval;
|
|
|
|
create_field *last_field;
|
2003-08-11 21:44:43 +02:00
|
|
|
char *savepoint_name; // Transaction savepoint id
|
2000-07-31 21:29:14 +02:00
|
|
|
udf_func udf;
|
2000-09-14 01:39:07 +02:00
|
|
|
HA_CHECK_OPT check_opt; // check/repair options
|
|
|
|
HA_CREATE_INFO create_info;
|
2000-09-17 02:23:30 +02:00
|
|
|
LEX_MASTER_INFO mi; // used by CHANGE MASTER
|
2002-05-15 12:50:38 +02:00
|
|
|
USER_RESOURCES mqh;
|
2000-09-14 01:39:07 +02:00
|
|
|
ulong thread_id,type;
|
|
|
|
enum_sql_command sql_command;
|
2002-06-02 20:22:20 +02:00
|
|
|
thr_lock_type lock_option;
|
2003-08-05 21:14:15 +02:00
|
|
|
enum SSL_type ssl_type; /* defined in violite.h */
|
2003-03-14 15:08:12 +01:00
|
|
|
enum my_lex_states next_state;
|
2000-09-14 01:39:07 +02:00
|
|
|
enum enum_duplicates duplicates;
|
2001-03-21 00:02:22 +01:00
|
|
|
enum enum_tx_isolation tx_isolation;
|
2001-04-07 00:18:33 +02:00
|
|
|
enum enum_ha_read_modes ha_read_mode;
|
|
|
|
enum ha_rkey_function ha_rkey_mode;
|
2001-05-11 22:26:12 +02:00
|
|
|
enum enum_enable_or_disable alter_keys_onoff;
|
2002-07-23 17:31:22 +02:00
|
|
|
enum enum_var_type option_type;
|
2003-10-13 10:20:19 +02:00
|
|
|
enum tablespace_op_type tablespace_op;
|
2003-08-05 21:14:15 +02:00
|
|
|
uint uint_geom_type;
|
2002-10-26 19:18:37 +02:00
|
|
|
uint grant, grant_tot_col, which_columns;
|
2002-06-02 20:22:20 +02:00
|
|
|
uint fk_delete_opt, fk_update_opt, fk_match_option;
|
2002-10-02 12:33:08 +02:00
|
|
|
uint param_count;
|
2003-08-05 21:14:15 +02:00
|
|
|
uint slave_thd_opt;
|
2003-10-16 14:54:47 +02:00
|
|
|
uint8 describe;
|
2004-01-28 18:35:52 +01:00
|
|
|
bool drop_if_exists, drop_temporary, local_file;
|
2003-05-15 18:35:39 +02:00
|
|
|
bool in_comment, ignore_space, verbose, simple_alter, no_write_to_binlog;
|
2003-10-16 14:54:47 +02:00
|
|
|
bool derived_tables;
|
2002-11-22 14:50:53 +01:00
|
|
|
bool safe_to_cache_query;
|
2003-04-26 14:12:14 +02:00
|
|
|
st_lex() {}
|
2003-11-17 19:53:40 +01:00
|
|
|
inline void uncacheable(uint8 cause)
|
2003-01-28 13:48:12 +01:00
|
|
|
{
|
|
|
|
safe_to_cache_query= 0;
|
2003-01-30 21:15:44 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
There are no sense to mark select_lex and union fields of LEX,
|
|
|
|
but we should merk all subselects as uncacheable from current till
|
|
|
|
most upper
|
|
|
|
*/
|
2003-07-03 01:30:52 +02:00
|
|
|
SELECT_LEX *sl;
|
2003-03-14 13:16:09 +01:00
|
|
|
SELECT_LEX_UNIT *un;
|
|
|
|
for (sl= current_select, un= sl->master_unit();
|
|
|
|
un != &unit;
|
|
|
|
sl= sl->outer_select(), un= sl->master_unit())
|
2003-01-30 21:15:44 +01:00
|
|
|
{
|
2003-11-17 19:53:40 +01:00
|
|
|
sl->uncacheable|= cause;
|
|
|
|
un->uncacheable|= cause;
|
2003-01-30 21:15:44 +01:00
|
|
|
}
|
2003-01-28 13:48:12 +01:00
|
|
|
}
|
2000-07-31 21:29:14 +02:00
|
|
|
} 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;
|
|
|
|
|
2003-12-19 18:52:13 +01:00
|
|
|
#define current_lex (current_thd->lex)
|