12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
17
/* A lexical scanner on a temporary buffer with a yacc interface */
23
#include <drizzled/sql_reserved_words.h>
25
#include <drizzled/configmake.h>
26
#include <drizzled/item/num.h>
27
#include <drizzled/error.h>
28
#include <drizzled/session.h>
29
#include <drizzled/sql_base.h>
30
#include <drizzled/lookup_symbol.h>
31
#include <drizzled/index_hint.h>
32
#include <drizzled/select_result.h>
41
/* Stay outside of the namespace because otherwise bison goes nuts */
42
int base_sql_lex(ParserType *arg, drizzled::Session *yysession);
47
static int lex_one_token(ParserType *arg, drizzled::Session *yysession);
50
save order by and tables in own lists.
20
#include "mysql_priv.h"
21
#include "item_create.h"
25
static int lex_one_token(void *arg, void *yythd);
28
We are using pointer to this variable for distinguishing between assignment
29
to NEW row field (when parsing trigger definition) and structured variable.
52
static bool add_to_list(Session *session, SQL_LIST &list, Item *item, bool asc)
56
if (!(order = (Order *) session->getMemRoot()->allocate(sizeof(Order))))
59
order->item_ptr= item;
60
order->item= &order->item_ptr;
64
order->counter_used= 0;
65
list.link_in_list((unsigned char*) order, (unsigned char**) &order->next);
32
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
71
35
LEX_STRING constant for null-string to be used in parser and other places.
73
37
const LEX_STRING null_lex_str= {NULL, 0};
75
Lex_input_stream::Lex_input_stream(Session *session,
39
/* Longest standard keyword name */
41
#define TOCK_NAME_LENGTH 24
44
The following data is based on the latin1 character set, and is only
45
used when comparing keywords
48
static uchar to_upper_lex[]=
50
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
51
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
52
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
53
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
54
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
55
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
56
96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
57
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
58
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
59
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
60
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
61
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
62
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
63
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
64
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
65
208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255
69
Names of the index hints (for error messages). Keep in sync with
73
const char * index_hint_type_name[] =
80
inline int lex_casecmp(const char *s, const char *t, uint len)
83
to_upper_lex[(uchar) *s++] == to_upper_lex[(uchar) *t++]) ;
93
for (i=0 ; i < array_elements(symbols) ; i++)
94
symbols[i].length=(uchar) strlen(symbols[i].name);
95
for (i=0 ; i < array_elements(sql_functions) ; i++)
96
sql_functions[i].length=(uchar) strlen(sql_functions[i].name);
103
{ // Call this when daemon ends
109
st_parsing_options::reset()
111
allows_variable= true;
112
allows_select_into= true;
113
allows_select_procedure= true;
114
allows_derived= true;
117
Lex_input_stream::Lex_input_stream(THD *thd,
76
118
const char* buffer,
77
unsigned int length) :
189
237
The operation converts the specified text literal to the utf8 and appends
190
238
the result to the utf8-body.
192
@param session Thread context.
240
@param thd Thread context.
193
241
@param txt Text literal.
194
242
@param txt_cs Character set of the text literal.
195
243
@param end_ptr Pointer in the pre-processed buffer, to which
196
244
m_cpp_utf8_processed_ptr will be set in the end of the
199
void Lex_input_stream::body_utf8_append_literal(const LEX_STRING *txt,
248
void Lex_input_stream::body_utf8_append_literal(THD *thd,
249
const LEX_STRING *txt,
250
CHARSET_INFO *txt_cs,
200
251
const char *end_ptr)
202
253
if (!m_cpp_utf8_processed_ptr)
258
if (!my_charset_same(txt_cs, &my_charset_utf8_general_ci))
260
thd->convert_string(&utf_txt,
261
&my_charset_utf8_general_ci,
262
txt->str, txt->length,
267
utf_txt.str= txt->str;
268
utf_txt.length= txt->length;
205
271
/* NOTE: utf_txt.length is in bytes, not in symbols. */
207
memcpy(m_body_utf8_ptr, txt->str, txt->length);
208
m_body_utf8_ptr += txt->length;
273
memcpy(m_body_utf8_ptr, utf_txt.str, utf_txt.length);
274
m_body_utf8_ptr += utf_txt.length;
209
275
*m_body_utf8_ptr= 0;
211
277
m_cpp_utf8_processed_ptr= end_ptr;
215
282
This is called before every query that is to be parsed.
216
283
Because of this, it's critical to not do too much things here.
217
284
(We already do too much here)
219
void LEX::start(Session *arg)
224
void lex_start(Session *session)
226
LEX *lex= session->getLex();
228
lex->session= lex->unit.session= session;
230
lex->context_stack.clear();
287
void lex_start(THD *thd)
291
lex->thd= lex->unit.thd= thd;
293
lex->context_stack.empty();
231
294
lex->unit.init_query();
232
295
lex->unit.init_select();
233
296
/* 'parent_lex' is used in init_query() so it must be before it. */
234
297
lex->select_lex.parent_lex= lex;
235
298
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
299
lex->value_list.empty();
300
lex->update_list.empty();
301
lex->param_list.empty();
302
lex->view_list.empty();
303
lex->auxiliary_table_list.empty();
239
304
lex->unit.next= lex->unit.master=
240
305
lex->unit.link_next= lex->unit.return_to= 0;
241
306
lex->unit.prev= lex->unit.link_prev= 0;
272
342
lex->nest_level=0 ;
273
343
lex->allow_sum_func= 0;
274
344
lex->in_sum_func= NULL;
346
ok, there must be a better solution for this, long-term
347
I tried "bzero" in the sql_yacc.yy code, but that for
348
some reason made the values zero, even if they were set
350
lex->server_options.server_name= 0;
351
lex->server_options.server_name_length= 0;
352
lex->server_options.host= 0;
353
lex->server_options.db= 0;
354
lex->server_options.username= 0;
355
lex->server_options.password= 0;
356
lex->server_options.scheme= 0;
357
lex->server_options.socket= 0;
358
lex->server_options.owner= 0;
359
lex->server_options.port= -1;
277
361
lex->is_lex_started= true;
278
lex->statement= NULL;
280
lex->is_cross= false;
365
void lex_end(LEX *lex)
369
my_free(lex->yacc_yyss, MYF(0));
370
my_free(lex->yacc_yyvs, MYF(0));
295
safe_delete(_create_table);
302
safe_delete(statement);
375
/* release used plugins */
376
plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer,
377
lex->plugins.elements);
378
reset_dynamic(&lex->plugins);
305
static int find_keyword(Lex_input_stream *lip, uint32_t len, bool function)
384
static int find_keyword(Lex_input_stream *lip, uint len, bool function)
307
/* Plenty of memory for the largest lex symbol we have */
309
386
const char *tok= lip->get_tok_start();
311
for (;tok_pos<len && tok_pos<63;tok_pos++)
312
tok_upper[tok_pos]=my_toupper(system_charset_info, tok[tok_pos]);
313
tok_upper[tok_pos]=0;
315
const SYMBOL *symbol= lookup_symbol(tok_upper, len, function);
388
SYMBOL *symbol= get_hash_symbol(tok, len, function);
318
391
lip->yylval->symbol.symbol=symbol;
855
1008
while (my_isdigit(cs, (c = lip->yyGet()))) ;
856
1009
if (!ident_map[c])
857
1010
{ // Can't be identifier
858
state=MY_LEX_INT_OR_REAL;
1011
state=MY_LEX_INT_OR_REAL;
861
1014
if (c == 'e' || c == 'E')
863
// The following test is written this way to allow numbers of type 1e1
1016
// The following test is written this way to allow numbers of type 1e1
864
1017
if (my_isdigit(cs,lip->yyPeek()) ||
865
1018
(c=(lip->yyGet())) == '+' || c == '-')
867
1020
if (my_isdigit(cs,lip->yyPeek())) // Number must have digit after sign
870
1023
while (my_isdigit(cs,lip->yyGet())) ;
871
1024
yylval->lex_str=get_token(lip, 0, lip->yyLength());
878
1031
case MY_LEX_IDENT_START: // We come here after '.'
879
1032
result_state= IDENT;
1033
#if defined(USE_MB) && defined(USE_MB_IDENT)
882
result_state= IDENT_QUOTED;
1036
result_state= IDENT_QUOTED;
883
1037
while (ident_map[c=lip->yyGet()])
885
1039
if (my_mbcharlen(cs, c) > 1)
887
int l= my_ismbchar(cs, lip->get_ptr() -1, lip->get_end_of_query());
1042
if ((l = my_ismbchar(cs,
1044
lip->get_end_of_query())) == 0)
890
1046
lip->skip_binary(l-1);
896
1053
for (result_state=0; ident_map[c= lip->yyGet()]; result_state|= c) {};
897
1054
/* If there were non-ASCII characters, mark that we must convert */
898
1055
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
900
1057
if (c == '.' && ident_map[(uint8_t)lip->yyPeek()])
901
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
1058
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
903
1060
yylval->lex_str= get_token(lip, 0, lip->yyLength());
905
1062
lip->body_utf8_append(lip->m_cpp_text_start);
907
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1064
lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1065
lip->m_cpp_text_end);
909
1067
return(result_state);
911
1069
case MY_LEX_USER_VARIABLE_DELIMITER: // Found quote char
913
uint32_t double_quotes= 0;
1071
uint double_quotes= 0;
914
1072
char quote_char= c; // Used char
915
1073
while ((c=lip->yyGet()))
918
if ((var_length= my_mbcharlen(cs, c)) == 1)
922
if (lip->yyPeek() != quote_char)
929
else if (var_length < 1)
1076
if ((var_length= my_mbcharlen(cs, c)) == 1)
1078
if (c == quote_char)
1080
if (lip->yyPeek() != quote_char)
1088
else if (var_length < 1)
931
1090
lip->skip_binary(var_length-1);
933
1093
if (double_quotes)
934
yylval->lex_str=get_quoted_token(lip, 1, lip->yyLength() - double_quotes -1, quote_char);
1094
yylval->lex_str=get_quoted_token(lip, 1,
1095
lip->yyLength() - double_quotes -1,
936
1098
yylval->lex_str=get_token(lip, 1, lip->yyLength() -1);
937
1099
if (c == quote_char)
938
1100
lip->yySkip(); // Skip end `
939
1101
lip->next_state= MY_LEX_START;
940
1103
lip->body_utf8_append(lip->m_cpp_text_start);
941
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1105
lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1106
lip->m_cpp_text_end);
942
1108
return(IDENT_QUOTED);
944
1110
case MY_LEX_INT_OR_REAL: // Complete int or incomplete real
946
1112
{ // Found complete integer number.
947
1113
yylval->lex_str=get_token(lip, 0, lip->yyLength());
948
return int_token(yylval->lex_str.str,yylval->lex_str.length);
1114
return int_token(yylval->lex_str.str,yylval->lex_str.length);
951
1117
case MY_LEX_REAL: // Incomplete real number
1262
1444
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
1265
lip->next_state=MY_LEX_IDENT_SEP;
1447
lip->next_state=MY_LEX_IDENT_SEP;
1266
1448
length= lip->yyLength();
1267
1449
if (length == 0)
1268
1450
return(ABORT_SYM); // Names must be nonempty.
1269
1451
if ((tokval= find_keyword(lip, length,0)))
1271
1453
lip->yyUnget(); // Put back 'c'
1272
return(tokval); // Was keyword
1454
return(tokval); // Was keyword
1274
1456
yylval->lex_str=get_token(lip, 0, length);
1276
1458
lip->body_utf8_append(lip->m_cpp_text_start);
1278
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1460
lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1461
lip->m_cpp_text_end);
1280
1463
return(result_state);
1285
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1470
Construct a copy of this object to be used for mysql_alter_table
1471
and mysql_create_table.
1473
Historically, these two functions modify their Alter_info
1474
arguments. This behaviour breaks re-execution of prepared
1475
statements and stored procedures and is compensated by always
1476
supplying a copy of Alter_info to these functions.
1478
@return You need to use check the error in THD for out
1479
of memory condition after calling this function.
1482
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1483
:drop_list(rhs.drop_list, mem_root),
1484
alter_list(rhs.alter_list, mem_root),
1485
key_list(rhs.key_list, mem_root),
1486
create_list(rhs.create_list, mem_root),
1488
keys_onoff(rhs.keys_onoff),
1489
tablespace_op(rhs.tablespace_op),
1490
no_parts(rhs.no_parts),
1491
build_method(rhs.build_method),
1492
datetime_field(rhs.datetime_field),
1493
error_if_not_empty(rhs.error_if_not_empty)
1496
Make deep copies of used objects.
1497
This is not a fully deep copy - clone() implementations
1498
of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1499
do not copy string constants. At the same length the only
1500
reason we make a copy currently is that ALTER/CREATE TABLE
1501
code changes input Alter_info definitions, but string
1502
constants never change.
1504
list_copy_and_replace_each_value(drop_list, mem_root);
1505
list_copy_and_replace_each_value(alter_list, mem_root);
1506
list_copy_and_replace_each_value(key_list, mem_root);
1507
list_copy_and_replace_each_value(create_list, mem_root);
1511
void trim_whitespace(CHARSET_INFO *cs, LEX_STRING *str)
1289
1515
This code assumes that there are no multi-bytes characters
1290
1516
that can be considered white-space.
1292
1519
while ((str->length > 0) && (my_isspace(cs, str->str[0])))
1562
1801
next->prev= prev;
1566
* Mark all Select_Lex struct from this to 'last' as dependent
1568
* @param Pointer to last Select_Lex struct, before wich all
1569
* Select_Lex have to be marked as dependent
1570
* @note 'last' should be reachable from this Select_Lex_Node
1572
void Select_Lex::mark_as_dependent(Select_Lex *last)
1806
st_select_lex_node::mark_as_dependent mark all st_select_lex struct from
1807
this to 'last' as dependent
1810
last - pointer to last st_select_lex struct, before wich all
1811
st_select_lex have to be marked as dependent
1814
'last' should be reachable from this st_select_lex_node
1817
void st_select_lex::mark_as_dependent(st_select_lex *last)
1575
1820
Mark all selects from resolved to 1 before select where was
1576
1821
found table as depended (of select where was found table)
1578
for (Select_Lex *s= this;
1823
for (SELECT_LEX *s= this;
1579
1824
s && s != last;
1580
1825
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1827
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1829
// Select is dependent of outer select
1585
s->uncacheable.set(UNCACHEABLE_DEPENDENT);
1586
s->uncacheable.set(UNCACHEABLE_UNITED);
1587
Select_Lex_Unit *munit= s->master_unit();
1588
munit->uncacheable.set(UNCACHEABLE_UNITED);
1589
munit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1590
for (Select_Lex *sl= munit->first_select(); sl ; sl= sl->next_select())
1830
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1831
UNCACHEABLE_DEPENDENT;
1832
SELECT_LEX_UNIT *munit= s->master_unit();
1833
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1834
UNCACHEABLE_DEPENDENT;
1835
for (SELECT_LEX *sl= munit->first_select(); sl ; sl= sl->next_select())
1593
! (sl->uncacheable.test(UNCACHEABLE_DEPENDENT) && sl->uncacheable.test(UNCACHEABLE_UNITED)))
1594
sl->uncacheable.set(UNCACHEABLE_UNITED);
1838
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1839
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1842
s->is_correlated= true;
1604
bool Select_Lex_Node::set_braces(bool)
1607
bool Select_Lex_Node::inc_in_sum_expr()
1610
uint32_t Select_Lex_Node::get_in_sum_expr()
1613
TableList* Select_Lex_Node::get_table_list()
1616
List<Item>* Select_Lex_Node::get_item_list()
1619
TableList *Select_Lex_Node::add_table_to_list(Session *,
1622
const bitset<NUM_OF_TABLE_OPTIONS>&,
1849
bool st_select_lex_node::set_braces(bool value __attribute__((__unused__)))
1851
bool st_select_lex_node::inc_in_sum_expr() { return 1; }
1852
uint st_select_lex_node::get_in_sum_expr() { return 0; }
1853
TABLE_LIST* st_select_lex_node::get_table_list() { return 0; }
1854
List<Item>* st_select_lex_node::get_item_list() { return 0; }
1855
TABLE_LIST *st_select_lex_node::add_table_to_list (THD *thd __attribute__((__unused__)),
1856
Table_ident *table __attribute__((__unused__)),
1857
LEX_STRING *alias __attribute__((__unused__)),
1858
ulong table_join_options __attribute__((__unused__)),
1859
thr_lock_type flags __attribute__((__unused__)),
1860
List<Index_hint> *hints __attribute__((__unused__)),
1861
LEX_STRING *option __attribute__((__unused__)))
1865
ulong st_select_lex_node::get_table_join_options()
1632
1871
prohibit using LIMIT clause
1634
bool Select_Lex::test_limit()
1873
bool st_select_lex::test_limit()
1636
1875
if (select_limit != 0)
1638
1877
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
1639
1878
"LIMIT & IN/ALL/ANY/SOME subquery");
1645
Select_Lex_Unit* Select_Lex_Unit::master_unit()
1650
Select_Lex* Select_Lex_Unit::outer_select()
1652
return (Select_Lex*) master;
1655
bool Select_Lex::add_order_to_list(Session *session, Item *item, bool asc)
1657
return add_to_list(session, order_list, item, asc);
1660
bool Select_Lex::add_item_to_list(Session *, Item *item)
1885
st_select_lex_unit* st_select_lex_unit::master_unit()
1891
st_select_lex* st_select_lex_unit::outer_select()
1893
return (st_select_lex*) master;
1897
bool st_select_lex::add_order_to_list(THD *thd, Item *item, bool asc)
1899
return add_to_list(thd, order_list, item, asc);
1903
bool st_select_lex::add_item_to_list(THD *thd __attribute__((__unused__)),
1662
1906
return(item_list.push_back(item));
1665
bool Select_Lex::add_group_to_list(Session *session, Item *item, bool asc)
1667
return add_to_list(session, group_list, item, asc);
1670
Select_Lex_Unit* Select_Lex::master_unit()
1672
return (Select_Lex_Unit*) master;
1675
Select_Lex* Select_Lex::outer_select()
1677
return (Select_Lex*) master->get_master();
1680
bool Select_Lex::set_braces(bool value)
1910
bool st_select_lex::add_group_to_list(THD *thd, Item *item, bool asc)
1912
return add_to_list(thd, group_list, item, asc);
1916
st_select_lex_unit* st_select_lex::master_unit()
1918
return (st_select_lex_unit*) master;
1922
st_select_lex* st_select_lex::outer_select()
1924
return (st_select_lex*) master->get_master();
1928
bool st_select_lex::set_braces(bool value)
1686
bool Select_Lex::inc_in_sum_expr()
1935
bool st_select_lex::inc_in_sum_expr()
1692
uint32_t Select_Lex::get_in_sum_expr()
1942
uint st_select_lex::get_in_sum_expr()
1694
1944
return in_sum_expr;
1697
TableList* Select_Lex::get_table_list()
1948
TABLE_LIST* st_select_lex::get_table_list()
1699
return (TableList*) table_list.first;
1950
return (TABLE_LIST*) table_list.first;
1702
List<Item>* Select_Lex::get_item_list()
1953
List<Item>* st_select_lex::get_item_list()
1704
1955
return &item_list;
1708
bool Select_Lex::setup_ref_array(Session *session, uint32_t order_group_num)
1958
ulong st_select_lex::get_table_join_options()
1960
return table_join_options;
1964
bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
1710
1966
if (ref_pointer_array)
1970
We have to create array in prepared statement memory if it is
1973
Query_arena *arena= thd->stmt_arena;
1713
1974
return (ref_pointer_array=
1714
(Item **)session->getMemRoot()->allocate(sizeof(Item*) * (n_child_sum_items +
1975
(Item **)arena->alloc(sizeof(Item*) * (n_child_sum_items +
1715
1976
item_list.elements +
1716
1977
select_n_having_items +
1717
1978
select_n_where_fields +
1718
1979
order_group_num)*5)) == 0;
1721
void Select_Lex_Unit::print(String *str, enum_query_type query_type)
1983
void st_select_lex_unit::print(String *str, enum_query_type query_type)
1723
1985
bool union_all= !union_distinct;
1724
for (Select_Lex *sl= first_select(); sl; sl= sl->next_select())
1986
for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1726
1988
if (sl != first_select())
1848
2125
query_tables= 0;
1849
2126
query_tables_last= &query_tables;
1850
2127
query_tables_own_last= 0;
2131
We delay real initialization of hash (and therefore related
2132
memory allocation) until first insertion into this hash.
2134
hash_clear(&sroutines);
2136
else if (sroutines.records)
2138
/* Non-zero sroutines.records means that hash was initialized. */
2139
my_hash_reset(&sroutines);
2141
sroutines_list.empty();
2142
sroutines_list_own_last= sroutines_list.next;
2143
sroutines_list_own_elements= 0;
2144
binlog_stmt_flags= 0;
2149
Destroy Query_tables_list object with freeing all resources used by it.
2152
destroy_query_tables_list()
2155
void Query_tables_list::destroy_query_tables_list()
2157
hash_free(&sroutines);
1854
2162
Initialize LEX object.
1860
2168
LEX object initialized with this constructor can be used as part of
1861
Session object for which one can safely call open_tables(), lock_tables()
2169
THD object for which one can safely call open_tables(), lock_tables()
1862
2170
and close_thread_tables() functions. But it is not yet ready for
1863
2171
statement parsing. On should use lex_start() function to prepare LEX
1873
sql_command(SQLCOM_END),
1875
option_type(OPT_DEFAULT),
1878
sum_expr_used(false),
1879
_create_table(NULL),
1880
_create_field(NULL),
2176
:result(0), yacc_yyss(0), yacc_yyvs(0),
2177
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
2180
my_init_dynamic_array2(&plugins, sizeof(plugin_ref),
2181
plugins_static_buffer,
2182
INITIAL_LEX_PLUGIN_LIST_SIZE,
2183
INITIAL_LEX_PLUGIN_LIST_SIZE);
1883
2184
reset_query_tables_list(true);
2189
Check whether the merging algorithm can be used on this VIEW
2192
st_lex::can_be_merged()
2195
We can apply merge algorithm if it is single SELECT view with
2196
subqueries only in WHERE clause (we do not count SELECTs of underlying
2197
views, and second level subqueries) and we have not grpouping, ordering,
2198
HAVING clause, aggregate functions, DISTINCT clause, LIMIT clause and
2199
several underlying tables.
2202
false - only temporary table algorithm can be used
2203
true - merge algorithm can be used
2206
bool st_lex::can_be_merged()
2208
// TODO: do not forget implement case when select_lex.table_list.elements==0
2210
/* find non VIEW subqueries/unions */
2211
bool selects_allow_merge= select_lex.next_select() == 0;
2212
if (selects_allow_merge)
2214
for (SELECT_LEX_UNIT *tmp_unit= select_lex.first_inner_unit();
2216
tmp_unit= tmp_unit->next_unit())
2218
if (tmp_unit->first_select()->parent_lex == this &&
2219
(tmp_unit->item == 0 ||
2220
(tmp_unit->item->place() != IN_WHERE &&
2221
tmp_unit->item->place() != IN_ON)))
2223
selects_allow_merge= 0;
2229
return (selects_allow_merge &&
2230
select_lex.group_list.elements == 0 &&
2231
select_lex.having == 0 &&
2232
select_lex.with_sum_func == 0 &&
2233
select_lex.table_list.elements >= 1 &&
2234
!(select_lex.options & SELECT_DISTINCT) &&
2235
select_lex.select_limit == 0);
2240
check if command can use VIEW with MERGE algorithm (for top VIEWs)
2243
st_lex::can_use_merged()
2246
Only listed here commands can use merge algorithm in top level
2247
SELECT_LEX (for subqueries will be used merge algorithm if
2248
st_lex::can_not_use_merged() is not true).
2251
false - command can't use merged VIEWs
2252
true - VIEWs with MERGE algorithms can be used
2255
bool st_lex::can_use_merged()
2257
switch (sql_command)
2260
case SQLCOM_CREATE_TABLE:
2262
case SQLCOM_UPDATE_MULTI:
2264
case SQLCOM_DELETE_MULTI:
2266
case SQLCOM_INSERT_SELECT:
2267
case SQLCOM_REPLACE:
2268
case SQLCOM_REPLACE_SELECT:
2277
Check if command can't use merged views in any part of command
2280
st_lex::can_not_use_merged()
2283
Temporary table algorithm will be used on all SELECT levels for queries
2284
listed here (see also st_lex::can_use_merged()).
2287
false - command can't use merged VIEWs
2288
true - VIEWs with MERGE algorithms can be used
2291
bool st_lex::can_not_use_merged()
2293
switch (sql_command)
2296
SQLCOM_SHOW_FIELDS is necessary to make
2297
information schema tables working correctly with views.
2298
see get_schema_tables_result function
2300
case SQLCOM_SHOW_FIELDS:
2308
Detect that we need only table structure of derived table/view
2311
only_view_structure()
2314
true yes, we need only structure
2315
false no, we need data
2318
bool st_lex::only_view_structure()
2320
switch (sql_command) {
2321
case SQLCOM_SHOW_CREATE:
2322
case SQLCOM_SHOW_TABLES:
2323
case SQLCOM_SHOW_FIELDS:
2332
Should Items_ident be printed correctly
2335
need_correct_ident()
2338
true yes, we need only structure
2339
false no, we need data
2343
bool st_lex::need_correct_ident()
2347
case SQLCOM_SHOW_CREATE:
2348
case SQLCOM_SHOW_TABLES:
2356
Get effective type of CHECK OPTION for given view
2359
get_effective_with_check()
2363
It have not sense to set CHECK OPTION for SELECT satement or subqueries,
2367
VIEW_CHECK_NONE no need CHECK OPTION
2368
VIEW_CHECK_LOCAL CHECK OPTION LOCAL
2369
VIEW_CHECK_CASCADED CHECK OPTION CASCADED
2372
uint8 st_lex::get_effective_with_check(TABLE_LIST *view __attribute__((__unused__)))
1887
2379
This method should be called only during parsing.
1888
2380
It is aware of compound statements (stored routine bodies)
1889
2381
and will initialize the destination with the default
1890
2382
database of the stored routine, rather than the default
1891
2383
database of the connection it is parsed in.
1892
E.g. if one has no current database selected, or current database
2384
E.g. if one has no current database selected, or current database
1893
2385
set to 'bar' and then issues:
1895
2387
CREATE PROCEDURE foo.p1() BEGIN SELECT * FROM t1 END//
2094
There are Select_Lex::add_table_to_list &
2095
Select_Lex::set_lock_for_tables are in sql_parse.cc
2097
Select_Lex::print is in sql_select.cc
2099
Select_Lex_Unit::prepare, Select_Lex_Unit::exec,
2100
Select_Lex_Unit::cleanup, Select_Lex_Unit::reinit_exec_mechanism,
2101
Select_Lex_Unit::change_result
2601
Save current state of Query_tables_list for this LEX, and prepare it
2602
for processing of new statemnt.
2605
reset_n_backup_query_tables_list()
2606
backup Pointer to Query_tables_list instance to be used for backup
2609
void st_lex::reset_n_backup_query_tables_list(Query_tables_list *backup __attribute__((__unused__)))
2615
Restore state of Query_tables_list for this LEX from backup.
2618
restore_backup_query_tables_list()
2619
backup Pointer to Query_tables_list instance used for backup
2622
void st_lex::restore_backup_query_tables_list(Query_tables_list *backup __attribute__((__unused__)))
2628
Checks for usage of routines and/or tables in a parsed statement
2631
st_lex:table_or_sp_used()
2634
false No routines and tables used
2635
true Either or both routines and tables are used.
2638
bool st_lex::table_or_sp_used()
2640
if (sroutines.records || query_tables)
2648
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
2651
fix_prepare_info_in_table_list()
2653
tbl List of tables to process
2656
Perform end-end-of prepare fixup for list of tables, if any of the tables
2657
is a merge-algorithm VIEW, recursively fix up its underlying tables as
2662
static void fix_prepare_info_in_table_list(THD *thd, TABLE_LIST *tbl)
2664
for (; tbl; tbl= tbl->next_local)
2668
tbl->prep_on_expr= tbl->on_expr;
2669
tbl->on_expr= tbl->on_expr->copy_andor_structure(thd);
2671
fix_prepare_info_in_table_list(thd, tbl->merge_underlying_list);
2677
Save WHERE/HAVING/ON clauses and replace them with disposable copies
2680
st_select_lex::fix_prepare_information
2682
conds in/out pointer to WHERE condition to be met at execution
2683
having_conds in/out pointer to HAVING condition to be met at execution
2686
The passed WHERE and HAVING are to be saved for the future executions.
2687
This function saves it, and returns a copy which can be thrashed during
2688
this execution of the statement. By saving/thrashing here we mean only
2690
The function also calls fix_prepare_info_in_table_list that saves all
2694
void st_select_lex::fix_prepare_information(THD *thd, Item **conds,
2695
Item **having_conds)
2697
if (thd->stmt_arena->is_conventional() == false && first_execution)
2703
*conds= where= prep_where->copy_andor_structure(thd);
2707
prep_having= *having_conds;
2708
*having_conds= having= prep_having->copy_andor_structure(thd);
2710
fix_prepare_info_in_table_list(thd, (TABLE_LIST *)table_list.first);
2716
There are st_select_lex::add_table_to_list &
2717
st_select_lex::set_lock_for_tables are in sql_parse.cc
2719
st_select_lex::print is in sql_select.cc
2721
st_select_lex_unit::prepare, st_select_lex_unit::exec,
2722
st_select_lex_unit::cleanup, st_select_lex_unit::reinit_exec_mechanism,
2723
st_select_lex_unit::change_result
2102
2724
are in sql_union.cc
2114
2736
Used in filling up the tagged hints list.
2115
This list is filled by first setting the kind of the hint as a
2737
This list is filled by first setting the kind of the hint as a
2116
2738
context variable and then adding hints of the current kind.
2117
2739
Then the context variable index_hint_type can be reset to the
2118
2740
next hint type.
2120
void Select_Lex::set_index_hint_type(enum index_hint_type type_arg, index_clause_map clause)
2742
void st_select_lex::set_index_hint_type(enum index_hint_type type_arg,
2743
index_clause_map clause)
2122
2745
current_index_hint_type= type_arg;
2123
2746
current_index_hint_clause= clause;
2127
2751
Makes an array to store index usage hints (ADD/FORCE/IGNORE INDEX).
2130
2754
alloc_index_hints()
2131
session current thread.
2133
void Select_Lex::alloc_index_hints (Session *session)
2135
index_hints= new (session->mem_root) List<Index_hint>();
2758
void st_select_lex::alloc_index_hints (THD *thd)
2760
index_hints= new (thd->mem_root) List<Index_hint>();
2139
adds an element to the array storing index usage hints
2766
adds an element to the array storing index usage hints
2140
2767
(ADD/FORCE/IGNORE INDEX).
2143
2770
add_index_hint()
2144
session current thread.
2145
2772
str name of the index.
2146
2773
length number of characters in str.
2149
2776
0 on success, non-zero otherwise
2151
bool Select_Lex::add_index_hint (Session *session, char *str, uint32_t length)
2778
bool st_select_lex::add_index_hint (THD *thd, char *str, uint length)
2153
return index_hints->push_front (new (session->mem_root)
2780
return index_hints->push_front (new (thd->mem_root)
2154
2781
Index_hint(current_index_hint_type,
2155
2782
current_index_hint_clause,
2159
bool check_for_sql_keyword(drizzled::lex_string_t const& string)
2161
if (sql_reserved_words::in_word_set(string.str, string.length))
2167
bool check_for_sql_keyword(drizzled::st_lex_symbol const& string)
2169
if (sql_reserved_words::in_word_set(string.str, string.length))
2176
} /* namespace drizzled */