1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#ifndef DRIZZLED_SQL_LEX_H
21
#define DRIZZLED_SQL_LEX_H
1
/* Copyright (C) 2000-2006 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
24
17
@defgroup Semantic_Analysis Semantic Analysis
26
#include <drizzled/message/table.pb.h>
28
#include "drizzled/plugin/function.h"
29
#include "drizzled/name_resolution_context.h"
30
#include "drizzled/item/subselect.h"
31
#include "drizzled/table_list.h"
32
#include "drizzled/function/math/real.h"
33
#include "drizzled/alter_drop.h"
34
#include "drizzled/alter_column.h"
35
#include "drizzled/alter_info.h"
36
#include "drizzled/key_part_spec.h"
37
#include "drizzled/index_hint.h"
38
#include "drizzled/statement.h"
39
#include "drizzled/optimizer/explain_plan.h"
47
class select_result_interceptor;
49
20
/* YACC and LEX Definitions */
51
22
/* These may not be declared yet */
57
} /* namespace drizzled */
60
29
The following hack is needed because mysql_yacc.cc does not define
61
30
YYSTYPE before including this file
65
# include <drizzled/set_var.h>
66
# include <drizzled/item/func.h>
68
# define LEX_YYSTYPE void *
70
# if defined(DRIZZLE_LEX)
71
# include <drizzled/foreign_key.h>
72
# include <drizzled/lex_symbol.h>
73
# include <drizzled/sql_yacc.h>
74
# define LEX_YYSTYPE YYSTYPE *
76
# define LEX_YYSTYPE void *
77
# endif /* defined(DRIZZLE_LEX) */
78
# endif /* DRIZZLE_YACC */
79
#endif /* DRIZZLE_SERVER */
36
#define LEX_YYSTYPE void *
38
#if defined(MYSQL_LEX)
39
#include "lex_symbol.h"
41
#define LEX_YYSTYPE YYSTYPE *
43
#define LEX_YYSTYPE void *
49
When a command is added here, be sure it's also added in mysqld.cc
50
in "struct show_var_st status_vars[]= {" ...
52
If the command returns a result set or is not allowed in stored
53
functions or triggers, please also make sure that
54
sp_get_flags_for_command (sp_head.cc) returns proper flags for the
58
enum enum_sql_command {
59
SQLCOM_SELECT, SQLCOM_CREATE_TABLE, SQLCOM_CREATE_INDEX, SQLCOM_ALTER_TABLE,
60
SQLCOM_UPDATE, SQLCOM_INSERT, SQLCOM_INSERT_SELECT,
61
SQLCOM_DELETE, SQLCOM_TRUNCATE, SQLCOM_DROP_TABLE, SQLCOM_DROP_INDEX,
62
SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,
63
SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_STATUS,
64
SQLCOM_SHOW_ENGINE_LOGS, SQLCOM_SHOW_ENGINE_STATUS, SQLCOM_SHOW_ENGINE_MUTEX,
65
SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
66
SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
67
SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB, SQLCOM_SHOW_TABLE_STATUS,
68
SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
69
SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB, SQLCOM_ALTER_DB,
70
SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,
71
SQLCOM_OPTIMIZE, SQLCOM_CHECK,
72
SQLCOM_ASSIGN_TO_KEYCACHE,
73
SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
74
SQLCOM_ROLLBACK, SQLCOM_ROLLBACK_TO_SAVEPOINT,
75
SQLCOM_COMMIT, SQLCOM_SAVEPOINT, SQLCOM_RELEASE_SAVEPOINT,
76
SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
77
SQLCOM_BEGIN, SQLCOM_CHANGE_MASTER,
79
SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_PURGE_BEFORE, SQLCOM_SHOW_BINLOGS,
80
SQLCOM_SHOW_OPEN_TABLES,
81
SQLCOM_SHOW_SLAVE_HOSTS, SQLCOM_DELETE_MULTI, SQLCOM_UPDATE_MULTI,
82
SQLCOM_SHOW_BINLOG_EVENTS,
83
SQLCOM_SHOW_WARNS, SQLCOM_EMPTY_QUERY, SQLCOM_SHOW_ERRORS,
85
SQLCOM_BINLOG_BASE64_EVENT,
87
SQLCOM_ALTER_DB_UPGRADE,
89
When a command is added here, be sure it's also added in mysqld.cc
90
in "struct show_var_st status_vars[]= {" ...
92
/* This should be the last !!! */
81
96
// describe/explain types
82
97
#define DESCRIBE_NORMAL 1
83
98
#define DESCRIBE_EXTENDED 2
102
enum enum_sp_data_access
104
SP_DEFAULT_ACCESS= 0,
111
const LEX_STRING sp_data_access_name[]=
113
{ C_STRING_WITH_LEN("") },
114
{ C_STRING_WITH_LEN("CONTAINS SQL") },
115
{ C_STRING_WITH_LEN("NO SQL") },
116
{ C_STRING_WITH_LEN("READS SQL DATA") },
117
{ C_STRING_WITH_LEN("MODIFIES SQL DATA") }
87
120
#define DERIVED_NONE 0
88
121
#define DERIVED_SUBQUERY 1
125
DROP_DEFAULT, // mode is not specified
126
DROP_CASCADE, // CASCADE option
127
DROP_RESTRICT // RESTRICT option
93
130
typedef List<Item> List_item;
132
/* SERVERS CACHE CHANGES */
133
typedef struct st_lex_server_options
136
uint server_name_length;
137
char *server_name, *host, *db, *username, *password, *scheme, *socket, *owner;
138
} LEX_SERVER_OPTIONS;
140
typedef struct st_lex_master_info
142
char *host, *user, *password, *log_file_name;
143
uint port, connect_retry;
144
float heartbeat_period;
148
Enum is used for making it possible to detect if the user
149
changed variable or if it should be left at old value
151
enum {LEX_MI_UNCHANGED, LEX_MI_DISABLE, LEX_MI_ENABLE}
152
ssl, ssl_verify_server_cert, heartbeat_opt;
153
char *ssl_key, *ssl_cert, *ssl_ca, *ssl_capath, *ssl_cipher;
154
char *relay_log_name;
95
159
enum sub_select_type
108
UNSPECIFIED_OLAP_TYPE,
161
UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE,
162
EXCEPT_TYPE, GLOBAL_OPTIONS_TYPE, DERIVED_TABLE_TYPE, OLAP_TYPE
167
UNSPECIFIED_OLAP_TYPE, CUBE_TYPE, ROLLUP_TYPE
170
enum tablespace_op_type
172
NO_TABLESPACE_OP, DISCARD_TABLESPACE, IMPORT_TABLESPACE
176
String names used to print a statement with index hints.
177
Keep in sync with index_hint_type.
179
extern const char * index_hint_type_name[];
180
typedef uchar index_clause_map;
114
The state of the lex parsing for selects
183
Bits in index_clause_map : one for each possible FOR clause in
184
USE/FORCE/IGNORE INDEX index hint specification
186
#define INDEX_HINT_MASK_JOIN (1)
187
#define INDEX_HINT_MASK_GROUP (1 << 1)
188
#define INDEX_HINT_MASK_ORDER (1 << 2)
190
#define INDEX_HINT_MASK_ALL (INDEX_HINT_MASK_JOIN | INDEX_HINT_MASK_GROUP | \
191
INDEX_HINT_MASK_ORDER)
193
/* Single element of an USE/FORCE/IGNORE INDEX list specified as a SQL hint */
194
class Index_hint : public Sql_alloc
197
/* The type of the hint : USE/FORCE/IGNORE */
198
enum index_hint_type type;
199
/* Where the hit applies to. A bitmask of INDEX_HINT_MASK_<place> values */
200
index_clause_map clause;
202
The index name. Empty (str=NULL) name represents an empty list
207
Index_hint (enum index_hint_type type_arg, index_clause_map clause_arg,
208
char *str, uint length) :
209
type(type_arg), clause(clause_arg)
212
key_name.length= length;
215
void print(THD *thd, String *str);
219
The state of the lex parsing for selects
116
221
master and slaves are pointers to select_lex.
117
222
master is pointer to upper level node.
118
223
slave is pointer to lower level node
248
353
UNCACHEABLE_EXPLAIN
249
354
UNCACHEABLE_PREPARE
252
357
enum sub_select_type linkage;
253
358
bool no_table_names_allowed; /* used for global order by */
254
359
bool no_error; /* suppress error message (convert it to warnings) */
256
361
static void *operator new(size_t size)
258
return memory::sql_alloc(size);
363
return sql_alloc(size);
260
static void *operator new(size_t size, memory::Root *mem_root)
261
{ return (void*) mem_root->alloc_root((uint32_t) size); }
262
static void operator delete(void *, size_t)
264
static void operator delete(void *, memory::Root *)
365
static void *operator new(size_t size, MEM_ROOT *mem_root)
366
{ return (void*) alloc_root(mem_root, (uint) size); }
367
static void operator delete(void *ptr __attribute__((__unused__)),
368
size_t size __attribute__((__unused__)))
369
{ TRASH(ptr, size); }
370
static void operator delete(void *ptr __attribute__((__unused__)),
371
MEM_ROOT *mem_root __attribute__((__unused__)))
266
Select_Lex_Node(): linkage(UNSPECIFIED_TYPE) {}
267
virtual ~Select_Lex_Node() {}
268
inline Select_Lex_Node* get_master() { return master; }
373
st_select_lex_node(): linkage(UNSPECIFIED_TYPE) {}
374
virtual ~st_select_lex_node() {}
375
inline st_select_lex_node* get_master() { return master; }
269
376
virtual void init_query();
270
377
virtual void init_select();
271
void include_down(Select_Lex_Node *upper);
272
void include_neighbour(Select_Lex_Node *before);
273
void include_standalone(Select_Lex_Node *sel, Select_Lex_Node **ref);
274
void include_global(Select_Lex_Node **plink);
378
void include_down(st_select_lex_node *upper);
379
void include_neighbour(st_select_lex_node *before);
380
void include_standalone(st_select_lex_node *sel, st_select_lex_node **ref);
381
void include_global(st_select_lex_node **plink);
277
virtual Select_Lex_Unit* master_unit()= 0;
278
virtual Select_Lex* outer_select()= 0;
279
virtual Select_Lex* return_after_parsing()= 0;
384
virtual st_select_lex_unit* master_unit()= 0;
385
virtual st_select_lex* outer_select()= 0;
386
virtual st_select_lex* return_after_parsing()= 0;
281
388
virtual bool set_braces(bool value);
282
389
virtual bool inc_in_sum_expr();
283
virtual uint32_t get_in_sum_expr();
284
virtual TableList* get_table_list();
390
virtual uint get_in_sum_expr();
391
virtual TABLE_LIST* get_table_list();
285
392
virtual List<Item>* get_item_list();
286
virtual uint32_t get_table_join_options();
287
virtual TableList *add_table_to_list(Session *session, Table_ident *table,
393
virtual ulong get_table_join_options();
394
virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table,
288
395
LEX_STRING *alias,
289
uint32_t table_options,
290
397
thr_lock_type flags= TL_UNLOCK,
291
398
List<Index_hint> *hints= 0,
292
399
LEX_STRING *option= 0);
293
virtual void set_lock_for_tables(thr_lock_type)
400
virtual void set_lock_for_tables(thr_lock_type lock_type __attribute__((__unused__)))
296
friend class Select_Lex_Unit;
297
friend bool mysql_new_select(LEX *lex, bool move_down);
403
friend class st_select_lex_unit;
404
friend bool mysql_new_select(struct st_lex *lex, bool move_down);
299
406
void fast_exclude();
408
typedef class st_select_lex_node SELECT_LEX_NODE;
303
Select_Lex_Unit - unit of selects (UNION, INTERSECT, ...) group
411
SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group
307
415
class select_result;
309
417
class select_union;
310
class Select_Lex_Unit: public Select_Lex_Node {
418
class st_select_lex_unit: public st_select_lex_node {
312
TableList result_table_list;
420
TABLE_LIST result_table_list;
313
421
select_union *union_result;
314
Table *table; /* temporary table using for appending UNION results */
422
TABLE *table; /* temporary table using for appending UNION results */
316
424
select_result *result;
317
uint64_t found_rows_for_union;
425
ulonglong found_rows_for_union;
318
426
bool saved_error;
385
492
void print(String *str, enum_query_type query_type);
387
bool add_fake_select_lex(Session *session);
388
void init_prepare_fake_select_lex(Session *session);
494
bool add_fake_select_lex(THD *thd);
495
void init_prepare_fake_select_lex(THD *thd);
389
496
bool change_result(select_result_interceptor *result,
390
497
select_result_interceptor *old_result);
391
void set_limit(Select_Lex *values);
392
void set_session(Session *session_arg) { session= session_arg; }
393
inline bool is_union ();
498
void set_limit(st_select_lex *values);
499
void set_thd(THD *thd_arg) { thd= thd_arg; }
500
inline bool is_union ();
395
friend void lex_start(Session *session);
502
friend void lex_start(THD *thd);
396
503
friend int subselect_union_engine::exec();
398
505
List<Item> *get_unit_column_types();
508
typedef class st_select_lex_unit SELECT_LEX_UNIT;
402
Select_Lex - store information of parsed SELECT statment
511
SELECT_LEX - store information of parsed SELECT statment
404
class Select_Lex: public Select_Lex_Node
513
class st_select_lex: public st_select_lex_node
407
516
Name_resolution_context context;
409
/* An Item representing the WHERE clause */
411
/* An Item representing the HAVING clause */
518
Item *where, *having; /* WHERE & HAVING clauses */
519
Item *prep_where; /* saved WHERE clause for prepared statement processing */
520
Item *prep_having;/* saved HAVING clause for prepared statement processing */
413
521
/* Saved values of the WHERE and HAVING clauses*/
414
Item::cond_result cond_value;
415
Item::cond_result having_value;
522
Item::cond_result cond_value, having_value;
416
523
/* point on lex in which it was created, used in view subquery detection */
418
525
enum olap_type olap;
419
/* FROM clause - points to the beginning of the TableList::next_local list. */
421
SQL_LIST group_list; /* GROUP BY clause. */
422
List<Item> item_list; /* list of fields & expressions */
423
List<String> interval_list;
424
bool is_item_list_lookup;
425
Join *join; /* after Join::prepare it is pointer to corresponding JOIN */
426
List<TableList> top_join_list; /* join list of the top level */
427
List<TableList> *join_list; /* list for the currently parsed join */
428
TableList *embedding; /* table embedding to the above list */
429
List<TableList> sj_nests;
526
/* FROM clause - points to the beginning of the TABLE_LIST::next_local list. */
528
SQL_LIST group_list; /* GROUP BY clause. */
529
List<Item> item_list; /* list of fields & expressions */
530
List<String> interval_list;
531
bool is_item_list_lookup;
533
Despite their names, the following are used in unions. This should
536
List<Item_real_func> *ftfunc_list;
537
List<Item_real_func> ftfunc_list_alloc;
538
JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
539
List<TABLE_LIST> top_join_list; /* join list of the top level */
540
List<TABLE_LIST> *join_list; /* list for the currently parsed join */
541
TABLE_LIST *embedding; /* table embedding to the above list */
542
List<TABLE_LIST> sj_nests;
431
544
Beginning of the list of leaves in a FROM clause, where the leaves
432
545
inlcude all base tables including view tables. The tables are connected
433
by TableList::next_leaf, so leaf_tables points to the left-most leaf.
546
by TABLE_LIST::next_leaf, so leaf_tables points to the left-most leaf.
435
TableList *leaf_tables;
436
enum drizzled::optimizer::select_type type; /* type of select for EXPLAIN */
548
TABLE_LIST *leaf_tables;
549
const char *type; /* type of select for EXPLAIN */
438
551
SQL_LIST order_list; /* ORDER clause */
439
552
SQL_LIST *gorder_list;
440
553
Item *select_limit, *offset_limit; /* LIMIT clause parameters */
441
/* Arrays of pointers to top elements of all_fields list */
554
// Arrays of pointers to top elements of all_fields list
442
555
Item **ref_pointer_array;
446
559
bigger then can be number of entries that will be added to all item
447
560
list during split_sum_func
449
uint32_t select_n_having_items;
450
uint32_t cond_count; /* number of arguments of and/or/xor in where/having/on */
451
uint32_t between_count; /* number of between predicates in where/having/on */
452
uint32_t max_equal_elems; /* maximal number of elements in multiple equalities */
562
uint select_n_having_items;
563
uint cond_count; /* number of arguments of and/or/xor in where/having/on */
564
uint between_count; /* number of between predicates in where/having/on */
565
uint max_equal_elems; /* maximal number of elements in multiple equalities */
454
567
Number of fields used in select list or where clause of current select
455
568
and all inner subselects.
457
uint32_t select_n_where_fields;
570
uint select_n_where_fields;
458
571
enum_parsing_place parsing_place; /* where we are parsing expression */
459
572
bool with_sum_func; /* sum function indicator */
574
PS or SP cond natural joins was alredy processed with permanent
575
arena and all additional items which we need alredy stored in it
577
bool conds_processed_with_permanent_arena;
461
uint32_t table_join_options;
462
uint32_t in_sum_expr;
463
uint32_t select_number; /* number of select (used for EXPLAIN) */
464
int8_t nest_level; /* nesting level of select */
465
Item_sum *inner_sum_func_list; /* list of sum func in nested selects */
466
uint32_t with_wild; /* item list contain '*' */
467
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
468
/* true when having fix field called in processing of this SELECT */
579
ulong table_join_options;
581
uint select_number; /* number of select (used for EXPLAIN) */
582
int nest_level; /* nesting level of select */
583
Item_sum *inner_sum_func_list; /* list of sum func in nested selects */
584
uint with_wild; /* item list contain '*' */
585
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
586
/* TRUE when having fix field called in processing of this SELECT */
469
587
bool having_fix_field;
470
588
/* List of references to fields referenced from inner selects */
471
589
List<Item_outer_ref> inner_refs_list;
472
590
/* Number of Item_sum-derived objects in this SELECT */
473
uint32_t n_sum_items;
474
592
/* Number of Item_sum-derived objects in children and descendant SELECTs */
475
uint32_t n_child_sum_items;
593
uint n_child_sum_items;
477
595
/* explicit LIMIT clause was used */
478
596
bool explicit_limit;
513
648
1 - aggregate functions are used in this select,
514
649
defined as SUM_FUNC_USED.
516
std::bitset<2> full_group_by_flag;
651
uint8 full_group_by_flag;
518
652
void init_query();
519
653
void init_select();
520
Select_Lex_Unit* master_unit();
521
Select_Lex_Unit* first_inner_unit()
523
return (Select_Lex_Unit*) slave;
525
Select_Lex* outer_select();
526
Select_Lex* next_select()
528
return (Select_Lex*) next;
530
Select_Lex* next_select_in_list()
532
return (Select_Lex*) link_next;
534
Select_Lex_Node** next_select_in_list_addr()
654
st_select_lex_unit* master_unit();
655
st_select_lex_unit* first_inner_unit()
657
return (st_select_lex_unit*) slave;
659
st_select_lex* outer_select();
660
st_select_lex* next_select() { return (st_select_lex*) next; }
661
st_select_lex* next_select_in_list()
663
return (st_select_lex*) link_next;
665
st_select_lex_node** next_select_in_list_addr()
536
667
return &link_next;
538
Select_Lex* return_after_parsing()
669
st_select_lex* return_after_parsing()
540
671
return master_unit()->return_after_parsing();
543
void mark_as_dependent(Select_Lex *last);
674
void mark_as_dependent(st_select_lex *last);
545
676
bool set_braces(bool value);
546
677
bool inc_in_sum_expr();
547
uint32_t get_in_sum_expr();
678
uint get_in_sum_expr();
549
bool add_item_to_list(Session *session, Item *item);
550
bool add_group_to_list(Session *session, Item *item, bool asc);
551
bool add_order_to_list(Session *session, Item *item, bool asc);
552
TableList* add_table_to_list(Session *session,
555
uint32_t table_options,
556
thr_lock_type flags= TL_UNLOCK,
557
List<Index_hint> *hints= 0,
558
LEX_STRING *option= 0);
559
TableList* get_table_list();
560
bool init_nested_join(Session *session);
561
TableList *end_nested_join(Session *session);
562
TableList *nest_last_join(Session *session);
563
void add_joined_table(TableList *table);
564
TableList *convert_right_join();
680
bool add_item_to_list(THD *thd, Item *item);
681
bool add_group_to_list(THD *thd, Item *item, bool asc);
682
bool add_order_to_list(THD *thd, Item *item, bool asc);
683
TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table,
686
thr_lock_type flags= TL_UNLOCK,
687
List<Index_hint> *hints= 0,
688
LEX_STRING *option= 0);
689
TABLE_LIST* get_table_list();
690
bool init_nested_join(THD *thd);
691
TABLE_LIST *end_nested_join(THD *thd);
692
TABLE_LIST *nest_last_join(THD *thd);
693
void add_joined_table(TABLE_LIST *table);
694
TABLE_LIST *convert_right_join();
565
695
List<Item>* get_item_list();
566
uint32_t get_table_join_options();
696
ulong get_table_join_options();
567
697
void set_lock_for_tables(thr_lock_type lock_type);
568
698
inline void init_order()
570
700
order_list.elements= 0;
571
701
order_list.first= 0;
572
order_list.next= (unsigned char**) &order_list.first;
702
order_list.next= (uchar**) &order_list.first;
575
705
This method created for reiniting LEX in mysql_admin_table() and can be
576
used only if you are going remove all Select_Lex & units except belonger
706
used only if you are going remove all SELECT_LEX & units except belonger
577
707
to LEX (LEX::unit & LEX::select, for other purposes there are
578
Select_Lex_Unit::exclude_level & Select_Lex_Unit::exclude_tree
708
SELECT_LEX_UNIT::exclude_level & SELECT_LEX_UNIT::exclude_tree
710
void cut_subtree() { slave= 0; }
584
711
bool test_limit();
586
friend void lex_start(Session *session);
587
Select_Lex() : n_sum_items(0), n_child_sum_items(0) {}
713
friend void lex_start(THD *thd);
714
st_select_lex() : n_sum_items(0), n_child_sum_items(0) {}
588
715
void make_empty_select()
593
bool setup_ref_array(Session *session, uint32_t order_group_num);
594
void print(Session *session, String *str, enum_query_type query_type);
720
bool setup_ref_array(THD *thd, uint order_group_num);
721
void print(THD *thd, String *str, enum_query_type query_type);
595
722
static void print_order(String *str,
597
724
enum_query_type query_type);
598
void print_limit(Session *session, String *str, enum_query_type query_type);
599
void fix_prepare_information(Session *session, Item **conds, Item **having_conds);
725
void print_limit(THD *thd, String *str, enum_query_type query_type);
726
void fix_prepare_information(THD *thd, Item **conds, Item **having_conds);
601
728
Destroy the used execution plan (JOIN) of this subtree (this
602
Select_Lex and all nested Select_Lexes and Select_Lex_Units).
729
SELECT_LEX and all nested SELECT_LEXes and SELECT_LEX_UNITs).
629
756
void clear_index_hints(void) { index_hints= NULL; }
632
759
/* current index hint kind. used in filling up index_hints */
633
760
enum index_hint_type current_index_hint_type;
634
761
index_clause_map current_index_hint_clause;
635
762
/* a list of USE/FORCE/IGNORE INDEX */
636
763
List<Index_hint> *index_hints;
765
typedef class st_select_lex SELECT_LEX;
639
inline bool Select_Lex_Unit::is_union ()
641
return first_select()->next_select() &&
767
inline bool st_select_lex_unit::is_union ()
769
return first_select()->next_select() &&
642
770
first_select()->next_select()->linkage == UNION_TYPE;
773
#define ALTER_ADD_COLUMN (1L << 0)
774
#define ALTER_DROP_COLUMN (1L << 1)
775
#define ALTER_CHANGE_COLUMN (1L << 2)
776
#define ALTER_COLUMN_STORAGE (1L << 3)
777
#define ALTER_COLUMN_FORMAT (1L << 4)
778
#define ALTER_COLUMN_ORDER (1L << 5)
779
#define ALTER_ADD_INDEX (1L << 6)
780
#define ALTER_DROP_INDEX (1L << 7)
781
#define ALTER_RENAME (1L << 8)
782
#define ALTER_ORDER (1L << 9)
783
#define ALTER_OPTIONS (1L << 10)
784
#define ALTER_COLUMN_DEFAULT (1L << 11)
785
#define ALTER_KEYS_ONOFF (1L << 12)
786
#define ALTER_STORAGE (1L << 13)
787
#define ALTER_ROW_FORMAT (1L << 14)
788
#define ALTER_CONVERT (1L << 15)
789
#define ALTER_FORCE (1L << 16)
790
#define ALTER_RECREATE (1L << 17)
791
#define ALTER_TABLE_REORG (1L << 24)
792
#define ALTER_FOREIGN_KEY (1L << 31)
795
@brief Parsing data for CREATE or ALTER TABLE.
797
This structure contains a list of columns or indexes to be created,
804
List<Alter_drop> drop_list;
805
List<Alter_column> alter_list;
807
List<Create_field> create_list;
809
enum enum_enable_or_disable keys_onoff;
810
enum tablespace_op_type tablespace_op;
812
enum ha_build_method build_method;
813
Create_field *datetime_field;
814
bool error_if_not_empty;
819
keys_onoff(LEAVE_AS_IS),
820
tablespace_op(NO_TABLESPACE_OP),
822
build_method(HA_BUILD_DEFAULT),
823
datetime_field(NULL),
824
error_if_not_empty(FALSE)
834
keys_onoff= LEAVE_AS_IS;
835
tablespace_op= NO_TABLESPACE_OP;
837
build_method= HA_BUILD_DEFAULT;
839
error_if_not_empty= FALSE;
841
Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root);
843
Alter_info &operator=(const Alter_info &rhs); // not implemented
844
Alter_info(const Alter_info &rhs); // not implemented
847
enum xa_option_words {XA_NONE, XA_JOIN, XA_RESUME, XA_ONE_PHASE,
848
XA_SUSPEND, XA_FOR_MIGRATE};
655
850
extern const LEX_STRING null_lex_str;
658
854
Class representing list of all tables used by statement.
659
855
It also contains information about stored functions used by statement
664
860
Also used by st_lex::reset_n_backup/restore_backup_query_tables_list()
665
861
methods to save and restore this information.
667
864
class Query_tables_list
670
867
/* Global list of all tables used by this statement */
671
TableList *query_tables;
868
TABLE_LIST *query_tables;
672
869
/* Pointer to next_global member of last element in the previous list. */
673
TableList **query_tables_last;
870
TABLE_LIST **query_tables_last;
675
872
If non-0 then indicates that query requires prelocking and points to
676
873
next_global member of last own element in query table list (i.e. last
677
874
table which was not added to it as part of preparation to prelocking).
678
875
0 - indicates that this query does not need prelocking.
680
TableList **query_tables_own_last;
877
TABLE_LIST **query_tables_own_last;
879
Set of stored routines called by statement.
880
(Note that we use lazy-initialization for this hash).
882
enum { START_SROUTINES_HASH_SIZE= 16 };
885
List linking elements of 'sroutines' set. Allows you to add new elements
886
to this set as you iterate through the list of existing elements.
887
'sroutines_list_own_last' is pointer to ::next member of last element of
888
this list which represents routine which is explicitly used by query.
889
'sroutines_list_own_elements' number of explicitly used routines.
890
We use these two members for restoring of 'sroutines_list' to the state
891
in which it was right after query parsing.
893
SQL_LIST sroutines_list;
894
uchar **sroutines_list_own_last;
895
uint sroutines_list_own_elements;
683
898
These constructor and destructor serve for creation/destruction
684
899
of Query_tables_list instances which are used as backup storage.
686
901
Query_tables_list() {}
687
virtual ~Query_tables_list() {}
902
~Query_tables_list() {}
689
904
/* Initializes (or resets) Query_tables_list object for "real" use. */
690
905
void reset_query_tables_list(bool init);
906
void destroy_query_tables_list();
907
void set_query_tables_list(Query_tables_list *state)
693
913
Direct addition to the list of query tables.
694
914
If you are using this function, you must ensure that the table
695
915
object, in particular table->db member, is initialized.
697
void add_to_query_tables(TableList *table)
917
void add_to_query_tables(TABLE_LIST *table)
699
919
*(table->prev_global= query_tables_last)= table;
700
920
query_tables_last= &table->next_global;
702
922
/* Return pointer to first not-own table in query-tables or 0 */
703
TableList* first_not_own_table()
923
TABLE_LIST* first_not_own_table()
705
925
return ( query_tables_own_last ? *query_tables_own_last : 0);
741
} /* namespace drizzled */
743
#include "drizzled/lex_input_stream.h"
748
/* The state of the lex parsing. This is saved in the Session struct */
749
class LEX : public Query_tables_list
752
Select_Lex_Unit unit; /* most upper unit */
753
Select_Lex select_lex; /* first Select_Lex */
754
/* current Select_Lex in parsing */
755
Select_Lex *current_select;
756
/* list of all Select_Lex */
757
Select_Lex *all_selects_list;
759
/* This is the "scale" for DECIMAL (S,P) notation */
761
/* This is the decimal precision in DECIMAL(S,P) notation */
765
* This is used kind of like the "ident" member variable below, as
766
* a place to store certain names of identifiers. Unfortunately, it
767
* is used differently depending on the Command (SELECT on a derived
1023
@brief This class represents the character input stream consumed during
1026
In addition to consuming the input stream, this class performs some
1027
comment pre processing, by filtering out out of bound special text
1028
from the query input stream.
1029
Two buffers, with pointers inside each buffers, are maintained in
1030
parallel. The 'raw' buffer is the original query text, which may
1031
contain out-of-bound comments. The 'cpp' (for comments pre processor)
1032
is the pre-processed buffer that contains only the query text that
1033
should be seen once out-of-bound data is removed.
1036
class Lex_input_stream
1039
Lex_input_stream(THD *thd, const char* buff, unsigned int length);
1040
~Lex_input_stream();
1045
When echo is true, characters parsed from the raw input stream are
1046
preserved. When false, characters parsed are silently ignored.
1047
@param echo the echo mode.
1049
void set_echo(bool echo)
1055
Skip binary from the input stream.
1056
@param n number of bytes to accept.
1058
void skip_binary(int n)
1062
memcpy(m_cpp_ptr, m_ptr, n);
1069
Get a character, and advance in the stream.
1070
@return the next character to parse.
1081
Get the last character accepted.
1082
@return the last character accepted.
1090
Look at the next character to parse, but do not accept it.
1098
Look ahead at some character to parse.
1099
@param n offset of the character to look up
1107
Cancel the effect of the last yyGet() or yySkip().
1108
Note that the echo mode should not change between calls to yyGet / yySkip
1109
and yyUnget. The caller is responsible for ensuring that.
1119
Accept a character, by advancing the input stream.
1124
*m_cpp_ptr++ = *m_ptr++;
1130
Accept multiple characters at once.
1131
@param n the number of characters to accept.
1137
memcpy(m_cpp_ptr, m_ptr, n);
1144
End of file indicator for the query text to parse.
1145
@return true if there are no more characters to parse
1149
return (m_ptr >= m_end_of_query);
1153
End of file indicator for the query text to parse.
1154
@param n number of characters expected
1155
@return true if there are less than n characters to parse
1159
return ((m_ptr + n) >= m_end_of_query);
1162
/** Get the raw query buffer. */
1163
const char *get_buf()
1168
/** Get the pre-processed query buffer. */
1169
const char *get_cpp_buf()
1174
/** Get the end of the raw query buffer. */
1175
const char *get_end_of_query()
1177
return m_end_of_query;
1180
/** Mark the stream position as the start of a new token. */
1183
m_tok_start_prev= m_tok_start;
1187
m_cpp_tok_start_prev= m_cpp_tok_start;
1188
m_cpp_tok_start= m_cpp_ptr;
1189
m_cpp_tok_end= m_cpp_ptr;
1193
Adjust the starting position of the current token.
1194
This is used to compensate for starting whitespace.
1196
void restart_token()
1199
m_cpp_tok_start= m_cpp_ptr;
1202
/** Get the token start position, in the raw buffer. */
1203
const char *get_tok_start()
1208
/** Get the token start position, in the pre-processed buffer. */
1209
const char *get_cpp_tok_start()
1211
return m_cpp_tok_start;
1214
/** Get the token end position, in the raw buffer. */
1215
const char *get_tok_end()
1220
/** Get the token end position, in the pre-processed buffer. */
1221
const char *get_cpp_tok_end()
1223
return m_cpp_tok_end;
1226
/** Get the previous token start position, in the raw buffer. */
1227
const char *get_tok_start_prev()
1229
return m_tok_start_prev;
1232
/** Get the current stream pointer, in the raw buffer. */
1233
const char *get_ptr()
1238
/** Get the current stream pointer, in the pre-processed buffer. */
1239
const char *get_cpp_ptr()
1244
/** Get the length of the current token, in the raw buffer. */
1248
The assumption is that the lexical analyser is always 1 character ahead,
1249
which the -1 account for.
1251
DBUG_ASSERT(m_ptr > m_tok_start);
1252
return (uint) ((m_ptr - m_tok_start) - 1);
1255
/** Get the utf8-body string. */
1256
const char *get_body_utf8_str()
1261
/** Get the utf8-body length. */
1262
uint get_body_utf8_length()
1264
return m_body_utf8_ptr - m_body_utf8;
1267
void body_utf8_start(THD *thd, const char *begin_ptr);
1268
void body_utf8_append(const char *ptr);
1269
void body_utf8_append(const char *ptr, const char *end_ptr);
1270
void body_utf8_append_literal(THD *thd,
1271
const LEX_STRING *txt,
1272
CHARSET_INFO *txt_cs,
1273
const char *end_ptr);
1275
/** Current thread. */
1278
/** Current line number. */
1281
/** Length of the last token parsed. */
1284
/** Interface with bison, value of the last token parsed. */
1287
/** LALR(2) resolution, look ahead token.*/
1288
int lookahead_token;
1290
/** LALR(2) resolution, value of the look ahead token.*/
1291
LEX_YYSTYPE lookahead_yylval;
1294
/** Pointer to the current position in the raw input stream. */
1297
/** Starting position of the last token parsed, in the raw buffer. */
1298
const char *m_tok_start;
1300
/** Ending position of the previous token parsed, in the raw buffer. */
1301
const char *m_tok_end;
1303
/** End of the query text in the input stream, in the raw buffer. */
1304
const char *m_end_of_query;
1306
/** Starting position of the previous token parsed, in the raw buffer. */
1307
const char *m_tok_start_prev;
1309
/** Begining of the query text in the input stream, in the raw buffer. */
1312
/** Length of the raw buffer. */
1315
/** Echo the parsed stream to the pre-processed buffer. */
1318
/** Pre-processed buffer. */
1321
/** Pointer to the current position in the pre-processed input stream. */
1325
Starting position of the last token parsed,
1326
in the pre-processed buffer.
1328
const char *m_cpp_tok_start;
1331
Starting position of the previous token parsed,
1332
in the pre-procedded buffer.
1334
const char *m_cpp_tok_start_prev;
1337
Ending position of the previous token parsed,
1338
in the pre-processed buffer.
1340
const char *m_cpp_tok_end;
1342
/** UTF8-body buffer created during parsing. */
1345
/** Pointer to the current position in the UTF8-body buffer. */
1346
char *m_body_utf8_ptr;
1349
Position in the pre-processed buffer. The query from m_cpp_buf to
1350
m_cpp_utf_processed_ptr is converted to UTF8-body.
1352
const char *m_cpp_utf8_processed_ptr;
1356
/** Current state of the lexical analyser. */
1357
enum my_lex_states next_state;
1360
Position of ';' in the stream, to delimit multiple queries.
1361
This delimiter is in the raw buffer.
1363
const char *found_semicolon;
1365
/** Token character bitmaps, to detect 7bit strings. */
1368
/** SQL_MODE = IGNORE_SPACE. */
1372
TRUE if we're parsing a prepared statement: in this mode
1373
we should allow placeholders and disallow multi-statements.
1375
bool stmt_prepare_mode;
1377
/** State of the lexical analyser for comments. */
1378
enum_comment_state in_comment;
1381
Starting position of the TEXT_STRING or IDENT in the pre-processed
1384
NOTE: this member must be used within MYSQLlex() function only.
1386
const char *m_cpp_text_start;
1389
Ending position of the TEXT_STRING or IDENT in the pre-processed
1392
NOTE: this member must be used within MYSQLlex() function only.
1394
const char *m_cpp_text_end;
1397
Character set specified by the character-set-introducer.
1399
NOTE: this member must be used within MYSQLlex() function only.
1401
CHARSET_INFO *m_underscore_cs;
1405
/* The state of the lex parsing. This is saved in the THD struct */
1407
typedef struct st_lex : public Query_tables_list
1409
SELECT_LEX_UNIT unit; /* most upper unit */
1410
SELECT_LEX select_lex; /* first SELECT_LEX */
1411
/* current SELECT_LEX in parsing */
1412
SELECT_LEX *current_select;
1413
/* list of all SELECT_LEX */
1414
SELECT_LEX *all_selects_list;
1416
char *length,*dec,*change;
770
1417
LEX_STRING name;
771
/* The string literal used in a LIKE expression */
1419
LEX_STRING backup_dir; /* For RESTORE/BACKUP */
1420
char* to_log; /* For PURGE MASTER LOGS TO */
1421
char* x509_subject,*x509_issuer,*ssl_cipher;
773
file_exchange *exchange;
1423
sql_exchange *exchange;
774
1424
select_result *result;
777
* This is current used to store the name of a named key cache
778
* or a named savepoint. It should probably be refactored out into
779
* the eventual Command class built for the Keycache and Savepoint
784
unsigned char* yacc_yyss, *yacc_yyvs;
785
/* The owning Session of this LEX */
787
const CHARSET_INFO *charset;
1425
Item *default_value, *on_update_value;
1426
LEX_STRING comment, ident;
1428
uchar* yacc_yyss, *yacc_yyvs;
1431
/* maintain a list of used plugins for this LEX */
1432
DYNAMIC_ARRAY plugins;
1433
plugin_ref plugins_static_buffer[INITIAL_LEX_PLUGIN_LIST_SIZE];
1435
CHARSET_INFO *charset;
788
1436
bool text_string_is_7bit;
789
1437
/* store original leaf_tables for INSERT SELECT and PS/SP */
790
TableList *leaf_tables_insert;
1438
TABLE_LIST *leaf_tables_insert;
792
1440
List<Key_part_spec> col_list;
793
1441
List<Key_part_spec> ref_list;
794
1442
List<String> interval_list;
795
List<Lex_Column> columns;
1443
List<LEX_USER> users_list;
1444
List<LEX_COLUMN> columns;
796
1445
List<Item> *insert_list,field_list,value_list,update_list;
797
1446
List<List_item> many_values;
798
1447
List<set_var_base> var_list;
1448
List<Item_param> param_list;
1449
List<LEX_STRING> view_list; // view list (list of field names in view)
800
1451
A stack of name resolution contexts for the query. This stack is used
801
1452
at parse time to set local name resolution contexts for various parts
840
1496
thr_lock_type lock_option;
841
1497
enum enum_duplicates duplicates;
1498
enum enum_tx_isolation tx_isolation;
1499
enum enum_ha_read_modes ha_read_mode;
843
1501
enum ha_rkey_function ha_rkey_mode;
844
1502
enum xa_option_words xa_opt;
1503
bool lock_transactional; /* For LOCK TABLE ... IN ... MODE */
846
sql_var_t option_type;
1505
enum enum_var_type option_type;
1506
enum enum_drop_mode drop_mode;
1508
uint profile_query_id;
1509
uint profile_options;
1510
enum column_format_type column_format;
1512
enum Foreign_key::fk_match_opt fk_match_option;
1513
enum Foreign_key::fk_option fk_update_opt;
1514
enum Foreign_key::fk_option fk_delete_opt;
1515
uint slave_thd_opt, start_transaction_opt;
1518
In LEX representing update which were transformed to multi-update
1519
stores total number of tables. For LEX representing multi-delete
1520
holds number of tables from which we will delete records.
851
1525
A flag that indicates what kinds of derived tables are present in the
852
1526
query (0 if no derived tables, otherwise DERIVED_SUBQUERY).
854
uint8_t derived_tables;
856
/* Was the IGNORE symbol found in statement */
1528
uint8 derived_tables;
1529
bool drop_if_exists, drop_temporary, local_file, one_shot_set;
1531
bool verbose, no_write_to_binlog;
1533
bool tx_chain, tx_release;
1535
Special JOIN::prepare mode: changing of query is prohibited.
1536
When creating a view, we need to just check its syntax omitting
1537
any optimizations: afterwards definition of the view will be
1538
reconstructed by means of ::print() methods and written to
1539
to an .frm file. We need this definition to stay untouched.
1541
bool view_prepare_mode;
1542
bool subqueries, ignore;
1543
st_parsing_options parsing_options;
1544
Alter_info alter_info;
1547
field_list was created for view and should be removed before PS/SP
1550
bool empty_field_list_on_rset;
1553
Pointers to part of LOAD DATA statement that should be rewritten
1554
during replication ("LOCAL 'filename' REPLACE INTO" part).
1556
const char *fname_start;
1557
const char *fname_end;
860
During name resolution search only in the table list given by
1560
During name resolution search only in the table list given by
861
1561
Name_resolution_context::first_name_resolution_table and
862
1562
Name_resolution_context::last_name_resolution_table
863
(see Item_field::fix_fields()).
1563
(see Item_field::fix_fields()).
865
1565
bool use_only_table_context;
867
/* Was the ESCAPE keyword used? */
868
1567
bool escape_used;
869
1568
bool is_lex_started; /* If lex_start() did run. For debugging. */
873
/* Note that init and de-init mostly happen in lex_start and lex_end
874
and not here. This is because LEX isn't delete/new for each new
875
statement in a session. It's re-used by doing lex_end, lex_start
1574
destroy_query_tables_list();
1575
plugin_unlock_list(NULL, (plugin_ref *)plugins.buffer, plugins.elements);
1576
delete_dynamic(&plugins);
882
TableList *unlink_first_table(bool *link_to_local);
883
void link_first_table_back(TableList *first, bool link_to_local);
1579
TABLE_LIST *unlink_first_table(bool *link_to_local);
1580
void link_first_table_back(TABLE_LIST *first, bool link_to_local);
884
1581
void first_lists_tables_same();
1583
bool can_be_merged();
1584
bool can_use_merged();
1585
bool can_not_use_merged();
886
1586
bool only_view_structure();
887
1587
bool need_correct_ident();
1588
uint8 get_effective_with_check(TABLE_LIST *view);
1590
Is this update command where 'WHITH CHECK OPTION' clause is important
1593
st_lex::which_check_option_applicable()
1596
TRUE have to take 'WHITH CHECK OPTION' clause into account
1597
FALSE 'WHITH CHECK OPTION' clause do not need
1599
inline bool which_check_option_applicable()
1601
switch (sql_command) {
1603
case SQLCOM_UPDATE_MULTI:
1605
case SQLCOM_INSERT_SELECT:
1606
case SQLCOM_REPLACE:
1607
case SQLCOM_REPLACE_SELECT:
889
1615
void cleanup_after_one_table_open();
905
1631
return context_stack.head();
908
Restore the LEX and Session in case of a parse error.
1634
Restore the LEX and THD in case of a parse error.
910
static void cleanup_lex_after_parse_error(Session *session);
1636
static void cleanup_lex_after_parse_error(THD *thd);
1638
void reset_n_backup_query_tables_list(Query_tables_list *backup);
1639
void restore_backup_query_tables_list(Query_tables_list *backup);
1641
bool table_or_sp_used();
913
1644
@brief check if the statement is a single-level join
914
1645
@return result of the check
915
@retval true The statement doesn't contain subqueries, unions and
1646
@retval TRUE The statement doesn't contain subqueries, unions and
916
1647
stored procedure calls.
917
@retval false There are subqueries, UNIONs or stored procedure calls.
1648
@retval FALSE There are subqueries, UNIONs or stored procedure calls.
919
bool is_single_level_stmt()
1650
bool is_single_level_stmt()
922
1653
This check exploits the fact that the last added to all_select_list is
923
on its top. So select_lex (as the first added) will be at the tail
1654
on its top. So select_lex (as the first added) will be at the tail
926
if (&select_lex == all_selects_list)
1657
if (&select_lex == all_selects_list && !sroutines.records)
928
assert(!all_selects_list->next_select_in_list());
1659
DBUG_ASSERT(!all_selects_list->next_select_in_list());
933
bool is_cross; // CROSS keyword was used
938
void setCacheable(bool val)
945
sum_expr_used= false;
948
void setSumExprUsed()
955
return sum_expr_used;
1666
struct st_lex_local: public st_lex
1668
static void *operator new(size_t size) throw()
1670
return sql_alloc(size);
1672
static void *operator new(size_t size, MEM_ROOT *mem_root) throw()
1674
return (void*) alloc_root(mem_root, (uint) size);
1676
static void operator delete(void *ptr __attribute__((__unused__)),
1677
size_t size __attribute__((__unused__)))
1678
{ TRASH(ptr, size); }
1679
static void operator delete(void *ptr __attribute__((__unused__)),
1680
MEM_ROOT *mem_root __attribute__((__unused__)))
1681
{ /* Never called */ }
962
extern void lex_start(Session *session);
1684
extern void lex_init(void);
1685
extern void lex_free(void);
1686
extern void lex_start(THD *thd);
963
1687
extern void lex_end(LEX *lex);
964
extern void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str);
1688
extern int MYSQLlex(void *arg, void *yythd);
1690
extern void trim_whitespace(CHARSET_INFO *cs, LEX_STRING *str);
965
1692
extern bool is_lex_native_function(const LEX_STRING *name);
968
1695
@} (End of group Semantic_Analysis)
971
} /* namespace drizzled */
973
#endif /* DRIZZLE_SERVER */
974
#endif /* DRIZZLED_SQL_LEX_H */
1698
#endif /* MYSQL_SERVER */