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 */
21
19
#define DRIZZLE_LEX 1
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 <drizzled/server_includes.h>
22
static int lex_one_token(void *arg, void *yythd);
25
We are using pointer to this variable for distinguishing between assignment
26
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);
29
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
71
32
LEX_STRING constant for null-string to be used in parser and other places.
73
34
const LEX_STRING null_lex_str= {NULL, 0};
75
Lex_input_stream::Lex_input_stream(Session *session,
36
/* Longest standard keyword name */
38
#define TOCK_NAME_LENGTH 24
41
The following data is based on the latin1 character set, and is only
42
used when comparing keywords
45
static unsigned char to_upper_lex[]=
47
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
48
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
49
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
50
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
51
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
52
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
53
96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
54
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
55
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
56
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
57
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
58
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
59
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
60
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
61
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
62
208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255
66
Names of the index hints (for error messages). Keep in sync with
70
const char * index_hint_type_name[] =
77
inline int lex_casecmp(const char *s, const char *t, uint32_t len)
80
to_upper_lex[(unsigned char) *s++] == to_upper_lex[(unsigned char) *t++]) ;
90
for (i=0 ; i < array_elements(symbols) ; i++)
91
symbols[i].length=(unsigned char) strlen(symbols[i].name);
92
for (i=0 ; i < array_elements(sql_functions) ; i++)
93
sql_functions[i].length=(unsigned char) strlen(sql_functions[i].name);
100
{ // Call this when daemon ends
106
st_parsing_options::reset()
108
allows_variable= true;
109
allows_select_into= true;
110
allows_select_procedure= true;
111
allows_derived= true;
114
Lex_input_stream::Lex_input_stream(THD *thd,
76
115
const char* buffer,
77
unsigned int length) :
189
233
The operation converts the specified text literal to the utf8 and appends
190
234
the result to the utf8-body.
192
@param session Thread context.
236
@param thd Thread context.
193
237
@param txt Text literal.
194
238
@param txt_cs Character set of the text literal.
195
239
@param end_ptr Pointer in the pre-processed buffer, to which
196
240
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,
244
void Lex_input_stream::body_utf8_append_literal(THD *thd,
245
const LEX_STRING *txt,
246
const CHARSET_INFO * const txt_cs,
200
247
const char *end_ptr)
202
249
if (!m_cpp_utf8_processed_ptr)
254
if (!my_charset_same(txt_cs, &my_charset_utf8_general_ci))
256
thd->convert_string(&utf_txt,
257
&my_charset_utf8_general_ci,
258
txt->str, txt->length,
263
utf_txt.str= txt->str;
264
utf_txt.length= txt->length;
205
267
/* 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;
269
memcpy(m_body_utf8_ptr, utf_txt.str, utf_txt.length);
270
m_body_utf8_ptr += utf_txt.length;
209
271
*m_body_utf8_ptr= 0;
211
273
m_cpp_utf8_processed_ptr= end_ptr;
215
278
This is called before every query that is to be parsed.
216
279
Because of this, it's critical to not do too much things here.
217
280
(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();
283
void lex_start(THD *thd)
287
lex->thd= lex->unit.thd= thd;
289
lex->context_stack.empty();
231
290
lex->unit.init_query();
232
291
lex->unit.init_select();
233
292
/* 'parent_lex' is used in init_query() so it must be before it. */
234
293
lex->select_lex.parent_lex= lex;
235
294
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
295
lex->value_list.empty();
296
lex->update_list.empty();
297
lex->param_list.empty();
298
lex->auxiliary_table_list.empty();
239
299
lex->unit.next= lex->unit.master=
240
300
lex->unit.link_next= lex->unit.return_to= 0;
241
301
lex->unit.prev= lex->unit.link_prev= 0;
244
304
lex->select_lex.master= &lex->unit;
245
305
lex->select_lex.prev= &lex->unit.slave;
246
306
lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0;
247
lex->select_lex.link_prev= (Select_Lex_Node**)&(lex->all_selects_list);
307
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
248
308
lex->select_lex.options= 0;
249
309
lex->select_lex.init_order();
250
lex->select_lex.group_list.clear();
310
lex->select_lex.group_list.empty();
251
311
lex->describe= 0;
312
lex->subqueries= false;
252
313
lex->derived_tables= 0;
253
314
lex->lock_option= TL_READ;
254
315
lex->leaf_tables_insert= 0;
255
lex->var_list.clear();
316
lex->parsing_options.reset();
317
lex->empty_field_list_on_rset= 0;
256
318
lex->select_lex.select_number= 1;
258
320
lex->select_lex.in_sum_expr=0;
259
lex->select_lex.group_list.clear();
260
lex->select_lex.order_list.clear();
321
lex->select_lex.ftfunc_list_alloc.empty();
322
lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
323
lex->select_lex.group_list.empty();
324
lex->select_lex.order_list.empty();
261
325
lex->sql_command= SQLCOM_END;
262
326
lex->duplicates= DUP_ERROR;
328
lex->proc_list.first= 0;
264
329
lex->escape_used= false;
265
330
lex->query_tables= 0;
266
331
lex->reset_query_tables_list(false);
267
332
lex->expr_allows_subselect= true;
268
333
lex->use_only_table_context= false;
334
lex->parse_vcol_expr= false;
270
336
lex->name.str= 0;
271
337
lex->name.length= 0;
272
338
lex->nest_level=0 ;
273
339
lex->allow_sum_func= 0;
274
340
lex->in_sum_func= NULL;
342
ok, there must be a better solution for this, long-term
343
I tried "memset" in the sql_yacc.yy code, but that for
344
some reason made the values zero, even if they were set
346
lex->server_options.server_name= 0;
347
lex->server_options.server_name_length= 0;
348
lex->server_options.host= 0;
349
lex->server_options.db= 0;
350
lex->server_options.username= 0;
351
lex->server_options.password= 0;
352
lex->server_options.scheme= 0;
353
lex->server_options.owner= 0;
354
lex->server_options.port= -1;
277
356
lex->is_lex_started= true;
278
lex->statement= NULL;
280
lex->is_cross= false;
360
void lex_end(LEX *lex)
364
free(lex->yacc_yyss);
365
free(lex->yacc_yyvs);
295
safe_delete(_create_table);
302
safe_delete(statement);
370
/* release used plugins */
371
plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer,
372
lex->plugins.elements);
373
reset_dynamic(&lex->plugins);
305
382
static int find_keyword(Lex_input_stream *lip, uint32_t len, bool function)
307
/* Plenty of memory for the largest lex symbol we have */
309
384
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);
386
SYMBOL *symbol= get_hash_symbol(tok, len, function);
318
389
lip->yylval->symbol.symbol=symbol;
855
977
while (my_isdigit(cs, (c = lip->yyGet()))) ;
856
978
if (!ident_map[c])
857
979
{ // Can't be identifier
858
state=MY_LEX_INT_OR_REAL;
980
state=MY_LEX_INT_OR_REAL;
861
983
if (c == 'e' || c == 'E')
863
// The following test is written this way to allow numbers of type 1e1
985
// The following test is written this way to allow numbers of type 1e1
864
986
if (my_isdigit(cs,lip->yyPeek()) ||
865
987
(c=(lip->yyGet())) == '+' || c == '-')
867
989
if (my_isdigit(cs,lip->yyPeek())) // Number must have digit after sign
870
992
while (my_isdigit(cs,lip->yyGet())) ;
871
993
yylval->lex_str=get_token(lip, 0, lip->yyLength());
878
1000
case MY_LEX_IDENT_START: // We come here after '.'
879
1001
result_state= IDENT;
1002
#if defined(USE_MB) && defined(USE_MB_IDENT)
882
result_state= IDENT_QUOTED;
1005
result_state= IDENT_QUOTED;
883
1006
while (ident_map[c=lip->yyGet()])
885
1008
if (my_mbcharlen(cs, c) > 1)
887
int l= my_ismbchar(cs, lip->get_ptr() -1, lip->get_end_of_query());
1011
if ((l = my_ismbchar(cs,
1013
lip->get_end_of_query())) == 0)
890
1015
lip->skip_binary(l-1);
896
1022
for (result_state=0; ident_map[c= lip->yyGet()]; result_state|= c) {};
897
1023
/* If there were non-ASCII characters, mark that we must convert */
898
1024
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
900
1026
if (c == '.' && ident_map[(uint8_t)lip->yyPeek()])
901
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
1027
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
903
1029
yylval->lex_str= get_token(lip, 0, lip->yyLength());
905
1031
lip->body_utf8_append(lip->m_cpp_text_start);
907
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1033
lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1034
lip->m_cpp_text_end);
909
1036
return(result_state);
1262
1412
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
1265
lip->next_state=MY_LEX_IDENT_SEP;
1415
lip->next_state=MY_LEX_IDENT_SEP;
1266
1416
length= lip->yyLength();
1267
1417
if (length == 0)
1268
1418
return(ABORT_SYM); // Names must be nonempty.
1269
1419
if ((tokval= find_keyword(lip, length,0)))
1271
1421
lip->yyUnget(); // Put back 'c'
1272
return(tokval); // Was keyword
1422
return(tokval); // Was keyword
1274
1424
yylval->lex_str=get_token(lip, 0, length);
1276
1426
lip->body_utf8_append(lip->m_cpp_text_start);
1278
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1428
lip->body_utf8_append_literal(thd, &yylval->lex_str, cs,
1429
lip->m_cpp_text_end);
1280
1431
return(result_state);
1438
Construct a copy of this object to be used for mysql_alter_table
1439
and mysql_create_table.
1441
Historically, these two functions modify their Alter_info
1442
arguments. This behaviour breaks re-execution of prepared
1443
statements and stored procedures and is compensated by always
1444
supplying a copy of Alter_info to these functions.
1446
@return You need to use check the error in THD for out
1447
of memory condition after calling this function.
1450
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1451
:drop_list(rhs.drop_list, mem_root),
1452
alter_list(rhs.alter_list, mem_root),
1453
key_list(rhs.key_list, mem_root),
1454
create_list(rhs.create_list, mem_root),
1456
keys_onoff(rhs.keys_onoff),
1457
tablespace_op(rhs.tablespace_op),
1458
no_parts(rhs.no_parts),
1459
build_method(rhs.build_method),
1460
datetime_field(rhs.datetime_field),
1461
error_if_not_empty(rhs.error_if_not_empty)
1464
Make deep copies of used objects.
1465
This is not a fully deep copy - clone() implementations
1466
of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1467
do not copy string constants. At the same length the only
1468
reason we make a copy currently is that ALTER/CREATE TABLE
1469
code changes input Alter_info definitions, but string
1470
constants never change.
1472
list_copy_and_replace_each_value(drop_list, mem_root);
1473
list_copy_and_replace_each_value(alter_list, mem_root);
1474
list_copy_and_replace_each_value(key_list, mem_root);
1475
list_copy_and_replace_each_value(create_list, mem_root);
1285
1479
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1562
1767
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)
1772
st_select_lex_node::mark_as_dependent mark all st_select_lex struct from
1773
this to 'last' as dependent
1776
last - pointer to last st_select_lex struct, before wich all
1777
st_select_lex have to be marked as dependent
1780
'last' should be reachable from this st_select_lex_node
1783
void st_select_lex::mark_as_dependent(st_select_lex *last)
1575
1786
Mark all selects from resolved to 1 before select where was
1576
1787
found table as depended (of select where was found table)
1578
for (Select_Lex *s= this;
1789
for (SELECT_LEX *s= this;
1579
1790
s && s != last;
1580
1791
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1793
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1795
// 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())
1796
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1797
UNCACHEABLE_DEPENDENT;
1798
SELECT_LEX_UNIT *munit= s->master_unit();
1799
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1800
UNCACHEABLE_DEPENDENT;
1801
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);
1804
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1805
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1808
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>&,
1815
bool st_select_lex_node::set_braces(bool value __attribute__((unused)))
1817
bool st_select_lex_node::inc_in_sum_expr() { return 1; }
1818
uint32_t st_select_lex_node::get_in_sum_expr() { return 0; }
1819
TableList* st_select_lex_node::get_table_list() { return 0; }
1820
List<Item>* st_select_lex_node::get_item_list() { return 0; }
1821
TableList *st_select_lex_node::add_table_to_list (THD *thd __attribute__((unused)),
1822
Table_ident *table __attribute__((unused)),
1823
LEX_STRING *alias __attribute__((unused)),
1824
uint32_t table_join_options __attribute__((unused)),
1825
thr_lock_type flags __attribute__((unused)),
1826
List<Index_hint> *hints __attribute__((unused)),
1827
LEX_STRING *option __attribute__((unused)))
1831
uint32_t st_select_lex_node::get_table_join_options()
1632
1837
prohibit using LIMIT clause
1634
bool Select_Lex::test_limit()
1839
bool st_select_lex::test_limit()
1636
1841
if (select_limit != 0)
1638
1843
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
1639
1844
"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)
1851
st_select_lex_unit* st_select_lex_unit::master_unit()
1857
st_select_lex* st_select_lex_unit::outer_select()
1859
return (st_select_lex*) master;
1863
bool st_select_lex::add_order_to_list(THD *thd, Item *item, bool asc)
1865
return add_to_list(thd, order_list, item, asc);
1869
bool st_select_lex::add_item_to_list(THD *thd __attribute__((unused)),
1662
1872
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)
1876
bool st_select_lex::add_group_to_list(THD *thd, Item *item, bool asc)
1878
return add_to_list(thd, group_list, item, asc);
1882
st_select_lex_unit* st_select_lex::master_unit()
1884
return (st_select_lex_unit*) master;
1888
st_select_lex* st_select_lex::outer_select()
1890
return (st_select_lex*) master->get_master();
1894
bool st_select_lex::set_braces(bool value)
1686
bool Select_Lex::inc_in_sum_expr()
1901
bool st_select_lex::inc_in_sum_expr()
1692
uint32_t Select_Lex::get_in_sum_expr()
1908
uint32_t st_select_lex::get_in_sum_expr()
1694
1910
return in_sum_expr;
1697
TableList* Select_Lex::get_table_list()
1914
TableList* st_select_lex::get_table_list()
1699
1916
return (TableList*) table_list.first;
1702
List<Item>* Select_Lex::get_item_list()
1919
List<Item>* st_select_lex::get_item_list()
1704
1921
return &item_list;
1708
bool Select_Lex::setup_ref_array(Session *session, uint32_t order_group_num)
1924
uint32_t st_select_lex::get_table_join_options()
1926
return table_join_options;
1930
bool st_select_lex::setup_ref_array(THD *thd, uint32_t order_group_num)
1710
1932
if (ref_pointer_array)
1713
1935
return (ref_pointer_array=
1714
(Item **)session->getMemRoot()->allocate(sizeof(Item*) * (n_child_sum_items +
1936
(Item **)thd->alloc(sizeof(Item*) * (n_child_sum_items +
1715
1937
item_list.elements +
1716
1938
select_n_having_items +
1717
1939
select_n_where_fields +
1718
1940
order_group_num)*5)) == 0;
1721
void Select_Lex_Unit::print(String *str, enum_query_type query_type)
1944
void st_select_lex_unit::print(String *str, enum_query_type query_type)
1723
1946
bool union_all= !union_distinct;
1724
for (Select_Lex *sl= first_select(); sl; sl= sl->next_select())
1947
for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1726
1949
if (sl != first_select())
1848
2086
query_tables= 0;
1849
2087
query_tables_last= &query_tables;
1850
2088
query_tables_own_last= 0;
2092
We delay real initialization of hash (and therefore related
2093
memory allocation) until first insertion into this hash.
2095
hash_clear(&sroutines);
2097
else if (sroutines.records)
2099
/* Non-zero sroutines.records means that hash was initialized. */
2100
my_hash_reset(&sroutines);
2102
sroutines_list.empty();
2103
sroutines_list_own_last= sroutines_list.next;
2104
sroutines_list_own_elements= 0;
2105
binlog_stmt_flags= 0;
2110
Destroy Query_tables_list object with freeing all resources used by it.
2113
destroy_query_tables_list()
2116
void Query_tables_list::destroy_query_tables_list()
2118
hash_free(&sroutines);
1854
2123
Initialize LEX object.
1860
2129
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()
2130
THD object for which one can safely call open_tables(), lock_tables()
1862
2131
and close_thread_tables() functions. But it is not yet ready for
1863
2132
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),
2137
:result(0), yacc_yyss(0), yacc_yyvs(0),
2138
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
2141
my_init_dynamic_array2(&plugins, sizeof(plugin_ref),
2142
plugins_static_buffer,
2143
INITIAL_LEX_PLUGIN_LIST_SIZE,
2144
INITIAL_LEX_PLUGIN_LIST_SIZE);
1883
2145
reset_query_tables_list(true);
2150
Check whether the merging algorithm can be used on this VIEW
2153
st_lex::can_be_merged()
2156
We can apply merge algorithm if it is single SELECT view with
2157
subqueries only in WHERE clause (we do not count SELECTs of underlying
2158
views, and second level subqueries) and we have not grpouping, ordering,
2159
HAVING clause, aggregate functions, DISTINCT clause, LIMIT clause and
2160
several underlying tables.
2163
false - only temporary table algorithm can be used
2164
true - merge algorithm can be used
2167
bool st_lex::can_be_merged()
2169
// TODO: do not forget implement case when select_lex.table_list.elements==0
2171
/* find non VIEW subqueries/unions */
2172
bool selects_allow_merge= select_lex.next_select() == 0;
2173
if (selects_allow_merge)
2175
for (SELECT_LEX_UNIT *tmp_unit= select_lex.first_inner_unit();
2177
tmp_unit= tmp_unit->next_unit())
2179
if (tmp_unit->first_select()->parent_lex == this &&
2180
(tmp_unit->item == 0 ||
2181
(tmp_unit->item->place() != IN_WHERE &&
2182
tmp_unit->item->place() != IN_ON)))
2184
selects_allow_merge= 0;
2190
return (selects_allow_merge &&
2191
select_lex.group_list.elements == 0 &&
2192
select_lex.having == 0 &&
2193
select_lex.with_sum_func == 0 &&
2194
select_lex.table_list.elements >= 1 &&
2195
!(select_lex.options & SELECT_DISTINCT) &&
2196
select_lex.select_limit == 0);
2201
check if command can use VIEW with MERGE algorithm (for top VIEWs)
2204
st_lex::can_use_merged()
2207
Only listed here commands can use merge algorithm in top level
2208
SELECT_LEX (for subqueries will be used merge algorithm if
2209
st_lex::can_not_use_merged() is not true).
2212
false - command can't use merged VIEWs
2213
true - VIEWs with MERGE algorithms can be used
2216
bool st_lex::can_use_merged()
2218
switch (sql_command)
2221
case SQLCOM_CREATE_TABLE:
2223
case SQLCOM_UPDATE_MULTI:
2225
case SQLCOM_DELETE_MULTI:
2227
case SQLCOM_INSERT_SELECT:
2228
case SQLCOM_REPLACE:
2229
case SQLCOM_REPLACE_SELECT:
2238
Check if command can't use merged views in any part of command
2241
st_lex::can_not_use_merged()
2244
Temporary table algorithm will be used on all SELECT levels for queries
2245
listed here (see also st_lex::can_use_merged()).
2248
false - command can't use merged VIEWs
2249
true - VIEWs with MERGE algorithms can be used
2252
bool st_lex::can_not_use_merged()
2254
switch (sql_command)
2257
SQLCOM_SHOW_FIELDS is necessary to make
2258
information schema tables working correctly with views.
2259
see get_schema_tables_result function
2261
case SQLCOM_SHOW_FIELDS:
2269
Detect that we need only table structure of derived table/view
2272
only_view_structure()
2275
true yes, we need only structure
2276
false no, we need data
2279
bool st_lex::only_view_structure()
2281
switch (sql_command) {
2282
case SQLCOM_SHOW_CREATE:
2283
case SQLCOM_SHOW_TABLES:
2284
case SQLCOM_SHOW_FIELDS:
2293
Should Items_ident be printed correctly
2296
need_correct_ident()
2299
true yes, we need only structure
2300
false no, we need data
2304
bool st_lex::need_correct_ident()
2308
case SQLCOM_SHOW_CREATE:
2309
case SQLCOM_SHOW_TABLES:
1887
2318
This method should be called only during parsing.
1888
2319
It is aware of compound statements (stored routine bodies)
1889
2320
and will initialize the destination with the default
1890
2321
database of the stored routine, rather than the default
1891
2322
database of the connection it is parsed in.
1892
E.g. if one has no current database selected, or current database
2323
E.g. if one has no current database selected, or current database
1893
2324
set to 'bar' and then issues:
1895
2326
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
2540
Save current state of Query_tables_list for this LEX, and prepare it
2541
for processing of new statemnt.
2544
reset_n_backup_query_tables_list()
2545
backup Pointer to Query_tables_list instance to be used for backup
2548
void st_lex::reset_n_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
2554
Restore state of Query_tables_list for this LEX from backup.
2557
restore_backup_query_tables_list()
2558
backup Pointer to Query_tables_list instance used for backup
2561
void st_lex::restore_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
2567
Checks for usage of routines and/or tables in a parsed statement
2570
st_lex:table_or_sp_used()
2573
false No routines and tables used
2574
true Either or both routines and tables are used.
2577
bool st_lex::table_or_sp_used()
2579
if (sroutines.records || query_tables)
2587
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
2590
fix_prepare_info_in_table_list()
2592
tbl List of tables to process
2595
Perform end-end-of prepare fixup for list of tables, if any of the tables
2596
is a merge-algorithm VIEW, recursively fix up its underlying tables as
2601
static void fix_prepare_info_in_table_list(THD *thd, TableList *tbl)
2603
for (; tbl; tbl= tbl->next_local)
2607
tbl->prep_on_expr= tbl->on_expr;
2608
tbl->on_expr= tbl->on_expr->copy_andor_structure(thd);
2610
fix_prepare_info_in_table_list(thd, tbl->merge_underlying_list);
2616
There are st_select_lex::add_table_to_list &
2617
st_select_lex::set_lock_for_tables are in sql_parse.cc
2619
st_select_lex::print is in sql_select.cc
2621
st_select_lex_unit::prepare, st_select_lex_unit::exec,
2622
st_select_lex_unit::cleanup, st_select_lex_unit::reinit_exec_mechanism,
2623
st_select_lex_unit::change_result
2102
2624
are in sql_union.cc
2114
2636
Used in filling up the tagged hints list.
2115
This list is filled by first setting the kind of the hint as a
2637
This list is filled by first setting the kind of the hint as a
2116
2638
context variable and then adding hints of the current kind.
2117
2639
Then the context variable index_hint_type can be reset to the
2118
2640
next hint type.
2120
void Select_Lex::set_index_hint_type(enum index_hint_type type_arg, index_clause_map clause)
2642
void st_select_lex::set_index_hint_type(enum index_hint_type type_arg,
2643
index_clause_map clause)
2122
2645
current_index_hint_type= type_arg;
2123
2646
current_index_hint_clause= clause;
2127
2651
Makes an array to store index usage hints (ADD/FORCE/IGNORE INDEX).
2130
2654
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>();
2658
void st_select_lex::alloc_index_hints (THD *thd)
2660
index_hints= new (thd->mem_root) List<Index_hint>();
2139
adds an element to the array storing index usage hints
2666
adds an element to the array storing index usage hints
2140
2667
(ADD/FORCE/IGNORE INDEX).
2143
2670
add_index_hint()
2144
session current thread.
2145
2672
str name of the index.
2146
2673
length number of characters in str.
2149
2676
0 on success, non-zero otherwise
2151
bool Select_Lex::add_index_hint (Session *session, char *str, uint32_t length)
2678
bool st_select_lex::add_index_hint (THD *thd, char *str, uint32_t length)
2153
return index_hints->push_front (new (session->mem_root)
2680
return index_hints->push_front (new (thd->mem_root)
2154
2681
Index_hint(current_index_hint_type,
2155
2682
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 */