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>
20
#include <drizzled/server_includes.h>
27
21
#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.
23
static int lex_one_token(void *arg, void *yysession);
26
We are using pointer to this variable for distinguishing between assignment
27
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);
30
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
71
33
LEX_STRING constant for null-string to be used in parser and other places.
73
35
const LEX_STRING null_lex_str= {NULL, 0};
39
The following data is based on the latin1 character set, and is only
40
used when comparing keywords
43
static unsigned char to_upper_lex[]=
45
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
46
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
47
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
49
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
50
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
51
96, 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,123,124,125,126,127,
53
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
54
144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
55
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
56
176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
57
192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
58
208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
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,247,216,217,218,219,220,221,222,255
64
Names of the index hints (for error messages). Keep in sync with
68
const char * index_hint_type_name[] =
75
inline int lex_casecmp(const char *s, const char *t, uint32_t len)
78
to_upper_lex[(unsigned char) *s++] == to_upper_lex[(unsigned char) *t++]) ;
88
for (i=0 ; i < array_elements(symbols) ; i++)
89
symbols[i].length=(unsigned char) strlen(symbols[i].name);
90
for (i=0 ; i < array_elements(sql_functions) ; i++)
91
sql_functions[i].length=(unsigned char) strlen(sql_functions[i].name);
98
{ // Call this when daemon ends
104
st_parsing_options::reset()
106
allows_variable= true;
107
allows_select_into= true;
108
allows_select_procedure= true;
109
allows_derived= true;
75
112
Lex_input_stream::Lex_input_stream(Session *session,
76
113
const char* buffer,
77
unsigned int length) :
115
: m_session(session),
196
238
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,
242
void Lex_input_stream::body_utf8_append_literal(Session *session,
243
const LEX_STRING *txt,
244
const CHARSET_INFO * const txt_cs,
200
245
const char *end_ptr)
202
247
if (!m_cpp_utf8_processed_ptr)
252
if (!my_charset_same(txt_cs, &my_charset_utf8_general_ci))
254
session->convert_string(&utf_txt,
255
&my_charset_utf8_general_ci,
256
txt->str, txt->length,
261
utf_txt.str= txt->str;
262
utf_txt.length= txt->length;
205
265
/* 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;
267
memcpy(m_body_utf8_ptr, utf_txt.str, utf_txt.length);
268
m_body_utf8_ptr += utf_txt.length;
209
269
*m_body_utf8_ptr= 0;
211
271
m_cpp_utf8_processed_ptr= end_ptr;
215
276
This is called before every query that is to be parsed.
216
277
Because of this, it's critical to not do too much things here.
217
278
(We already do too much here)
219
void LEX::start(Session *arg)
224
281
void lex_start(Session *session)
226
LEX *lex= session->getLex();
283
LEX *lex= session->lex;
228
285
lex->session= lex->unit.session= session;
230
lex->context_stack.clear();
287
lex->context_stack.empty();
231
288
lex->unit.init_query();
232
289
lex->unit.init_select();
233
290
/* 'parent_lex' is used in init_query() so it must be before it. */
234
291
lex->select_lex.parent_lex= lex;
235
292
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
293
lex->value_list.empty();
294
lex->update_list.empty();
295
lex->param_list.empty();
296
lex->auxiliary_table_list.empty();
239
297
lex->unit.next= lex->unit.master=
240
298
lex->unit.link_next= lex->unit.return_to= 0;
241
299
lex->unit.prev= lex->unit.link_prev= 0;
244
302
lex->select_lex.master= &lex->unit;
245
303
lex->select_lex.prev= &lex->unit.slave;
246
304
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);
305
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
248
306
lex->select_lex.options= 0;
249
307
lex->select_lex.init_order();
250
lex->select_lex.group_list.clear();
308
lex->select_lex.group_list.empty();
251
309
lex->describe= 0;
310
lex->subqueries= false;
252
311
lex->derived_tables= 0;
253
312
lex->lock_option= TL_READ;
254
313
lex->leaf_tables_insert= 0;
255
lex->var_list.clear();
314
lex->parsing_options.reset();
315
lex->empty_field_list_on_rset= 0;
256
316
lex->select_lex.select_number= 1;
258
318
lex->select_lex.in_sum_expr=0;
259
lex->select_lex.group_list.clear();
260
lex->select_lex.order_list.clear();
319
lex->select_lex.ftfunc_list_alloc.empty();
320
lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
321
lex->select_lex.group_list.empty();
322
lex->select_lex.order_list.empty();
261
323
lex->sql_command= SQLCOM_END;
262
324
lex->duplicates= DUP_ERROR;
326
lex->proc_list.first= 0;
264
327
lex->escape_used= false;
265
328
lex->query_tables= 0;
266
329
lex->reset_query_tables_list(false);
267
330
lex->expr_allows_subselect= true;
268
331
lex->use_only_table_context= false;
332
lex->parse_vcol_expr= false;
270
334
lex->name.str= 0;
271
335
lex->name.length= 0;
272
336
lex->nest_level=0 ;
273
337
lex->allow_sum_func= 0;
274
338
lex->in_sum_func= NULL;
340
ok, there must be a better solution for this, long-term
341
I tried "memset" in the sql_yacc.yy code, but that for
342
some reason made the values zero, even if they were set
344
lex->server_options.server_name= 0;
345
lex->server_options.server_name_length= 0;
346
lex->server_options.host= 0;
347
lex->server_options.db= 0;
348
lex->server_options.username= 0;
349
lex->server_options.password= 0;
350
lex->server_options.scheme= 0;
351
lex->server_options.owner= 0;
352
lex->server_options.port= -1;
277
354
lex->is_lex_started= true;
278
lex->statement= NULL;
280
lex->is_cross= false;
358
void lex_end(LEX *lex)
362
free(lex->yacc_yyss);
363
free(lex->yacc_yyvs);
295
safe_delete(_create_table);
302
safe_delete(statement);
368
/* release used plugins */
369
plugin_unlock_list(0, (plugin_ref*)lex->plugins.buffer,
370
lex->plugins.elements);
371
reset_dynamic(&lex->plugins);
305
380
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
382
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);
384
SYMBOL *symbol= get_hash_symbol(tok, len, function);
318
387
lip->yylval->symbol.symbol=symbol;
855
975
while (my_isdigit(cs, (c = lip->yyGet()))) ;
856
976
if (!ident_map[c])
857
977
{ // Can't be identifier
858
state=MY_LEX_INT_OR_REAL;
978
state=MY_LEX_INT_OR_REAL;
861
981
if (c == 'e' || c == 'E')
863
// The following test is written this way to allow numbers of type 1e1
983
// The following test is written this way to allow numbers of type 1e1
864
984
if (my_isdigit(cs,lip->yyPeek()) ||
865
985
(c=(lip->yyGet())) == '+' || c == '-')
867
987
if (my_isdigit(cs,lip->yyPeek())) // Number must have digit after sign
870
990
while (my_isdigit(cs,lip->yyGet())) ;
871
991
yylval->lex_str=get_token(lip, 0, lip->yyLength());
878
998
case MY_LEX_IDENT_START: // We come here after '.'
879
999
result_state= IDENT;
1000
#if defined(USE_MB) && defined(USE_MB_IDENT)
882
result_state= IDENT_QUOTED;
1003
result_state= IDENT_QUOTED;
883
1004
while (ident_map[c=lip->yyGet()])
885
1006
if (my_mbcharlen(cs, c) > 1)
887
int l= my_ismbchar(cs, lip->get_ptr() -1, lip->get_end_of_query());
1009
if ((l = my_ismbchar(cs,
1011
lip->get_end_of_query())) == 0)
890
1013
lip->skip_binary(l-1);
896
1020
for (result_state=0; ident_map[c= lip->yyGet()]; result_state|= c) {};
897
1021
/* If there were non-ASCII characters, mark that we must convert */
898
1022
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
900
1024
if (c == '.' && ident_map[(uint8_t)lip->yyPeek()])
901
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
1025
lip->next_state=MY_LEX_IDENT_SEP;// Next is '.'
903
1027
yylval->lex_str= get_token(lip, 0, lip->yyLength());
905
1029
lip->body_utf8_append(lip->m_cpp_text_start);
907
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1031
lip->body_utf8_append_literal(session, &yylval->lex_str, cs,
1032
lip->m_cpp_text_end);
909
1034
return(result_state);
1262
1410
result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT;
1265
lip->next_state=MY_LEX_IDENT_SEP;
1413
lip->next_state=MY_LEX_IDENT_SEP;
1266
1414
length= lip->yyLength();
1267
1415
if (length == 0)
1268
1416
return(ABORT_SYM); // Names must be nonempty.
1269
1417
if ((tokval= find_keyword(lip, length,0)))
1271
1419
lip->yyUnget(); // Put back 'c'
1272
return(tokval); // Was keyword
1420
return(tokval); // Was keyword
1274
1422
yylval->lex_str=get_token(lip, 0, length);
1276
1424
lip->body_utf8_append(lip->m_cpp_text_start);
1278
lip->body_utf8_append_literal(&yylval->lex_str, lip->m_cpp_text_end);
1426
lip->body_utf8_append_literal(session, &yylval->lex_str, cs,
1427
lip->m_cpp_text_end);
1280
1429
return(result_state);
1436
Construct a copy of this object to be used for mysql_alter_table
1437
and mysql_create_table.
1439
Historically, these two functions modify their Alter_info
1440
arguments. This behaviour breaks re-execution of prepared
1441
statements and stored procedures and is compensated by always
1442
supplying a copy of Alter_info to these functions.
1444
@return You need to use check the error in Session for out
1445
of memory condition after calling this function.
1448
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1449
:drop_list(rhs.drop_list, mem_root),
1450
alter_list(rhs.alter_list, mem_root),
1451
key_list(rhs.key_list, mem_root),
1452
create_list(rhs.create_list, mem_root),
1454
keys_onoff(rhs.keys_onoff),
1455
tablespace_op(rhs.tablespace_op),
1456
no_parts(rhs.no_parts),
1457
build_method(rhs.build_method),
1458
datetime_field(rhs.datetime_field),
1459
error_if_not_empty(rhs.error_if_not_empty)
1462
Make deep copies of used objects.
1463
This is not a fully deep copy - clone() implementations
1464
of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1465
do not copy string constants. At the same length the only
1466
reason we make a copy currently is that ALTER/CREATE TABLE
1467
code changes input Alter_info definitions, but string
1468
constants never change.
1470
list_copy_and_replace_each_value(drop_list, mem_root);
1471
list_copy_and_replace_each_value(alter_list, mem_root);
1472
list_copy_and_replace_each_value(key_list, mem_root);
1473
list_copy_and_replace_each_value(create_list, mem_root);
1285
1477
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1562
1765
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)
1770
st_select_lex_node::mark_as_dependent mark all st_select_lex struct from
1771
this to 'last' as dependent
1774
last - pointer to last st_select_lex struct, before wich all
1775
st_select_lex have to be marked as dependent
1778
'last' should be reachable from this st_select_lex_node
1781
void st_select_lex::mark_as_dependent(st_select_lex *last)
1575
1784
Mark all selects from resolved to 1 before select where was
1576
1785
found table as depended (of select where was found table)
1578
for (Select_Lex *s= this;
1787
for (SELECT_LEX *s= this;
1579
1788
s && s != last;
1580
1789
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1791
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1793
// 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())
1794
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1795
UNCACHEABLE_DEPENDENT;
1796
SELECT_LEX_UNIT *munit= s->master_unit();
1797
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1798
UNCACHEABLE_DEPENDENT;
1799
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);
1802
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1803
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1806
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>&,
1813
bool st_select_lex_node::set_braces(bool value __attribute__((unused)))
1815
bool st_select_lex_node::inc_in_sum_expr() { return 1; }
1816
uint32_t st_select_lex_node::get_in_sum_expr() { return 0; }
1817
TableList* st_select_lex_node::get_table_list() { return 0; }
1818
List<Item>* st_select_lex_node::get_item_list() { return 0; }
1819
TableList *st_select_lex_node::add_table_to_list (Session *session __attribute__((unused)),
1820
Table_ident *table __attribute__((unused)),
1821
LEX_STRING *alias __attribute__((unused)),
1822
uint32_t table_join_options __attribute__((unused)),
1823
thr_lock_type flags __attribute__((unused)),
1824
List<Index_hint> *hints __attribute__((unused)),
1825
LEX_STRING *option __attribute__((unused)))
1829
uint32_t st_select_lex_node::get_table_join_options()
1632
1835
prohibit using LIMIT clause
1634
bool Select_Lex::test_limit()
1837
bool st_select_lex::test_limit()
1636
1839
if (select_limit != 0)
1638
1841
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
1639
1842
"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)
1849
st_select_lex_unit* st_select_lex_unit::master_unit()
1855
st_select_lex* st_select_lex_unit::outer_select()
1857
return (st_select_lex*) master;
1861
bool st_select_lex::add_order_to_list(Session *session, Item *item, bool asc)
1657
1863
return add_to_list(session, order_list, item, asc);
1660
bool Select_Lex::add_item_to_list(Session *, Item *item)
1867
bool st_select_lex::add_item_to_list(Session *session __attribute__((unused)),
1662
1870
return(item_list.push_back(item));
1665
bool Select_Lex::add_group_to_list(Session *session, Item *item, bool asc)
1874
bool st_select_lex::add_group_to_list(Session *session, Item *item, bool asc)
1667
1876
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)
1880
st_select_lex_unit* st_select_lex::master_unit()
1882
return (st_select_lex_unit*) master;
1886
st_select_lex* st_select_lex::outer_select()
1888
return (st_select_lex*) master->get_master();
1892
bool st_select_lex::set_braces(bool value)
1686
bool Select_Lex::inc_in_sum_expr()
1899
bool st_select_lex::inc_in_sum_expr()
1692
uint32_t Select_Lex::get_in_sum_expr()
1906
uint32_t st_select_lex::get_in_sum_expr()
1694
1908
return in_sum_expr;
1697
TableList* Select_Lex::get_table_list()
1912
TableList* st_select_lex::get_table_list()
1699
1914
return (TableList*) table_list.first;
1702
List<Item>* Select_Lex::get_item_list()
1917
List<Item>* st_select_lex::get_item_list()
1704
1919
return &item_list;
1708
bool Select_Lex::setup_ref_array(Session *session, uint32_t order_group_num)
1922
uint32_t st_select_lex::get_table_join_options()
1924
return table_join_options;
1928
bool st_select_lex::setup_ref_array(Session *session, uint32_t order_group_num)
1710
1930
if (ref_pointer_array)
1713
1933
return (ref_pointer_array=
1714
(Item **)session->getMemRoot()->allocate(sizeof(Item*) * (n_child_sum_items +
1934
(Item **)session->alloc(sizeof(Item*) * (n_child_sum_items +
1715
1935
item_list.elements +
1716
1936
select_n_having_items +
1717
1937
select_n_where_fields +
1718
1938
order_group_num)*5)) == 0;
1721
void Select_Lex_Unit::print(String *str, enum_query_type query_type)
1942
void st_select_lex_unit::print(String *str, enum_query_type query_type)
1723
1944
bool union_all= !union_distinct;
1724
for (Select_Lex *sl= first_select(); sl; sl= sl->next_select())
1945
for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
1726
1947
if (sl != first_select())
1863
2130
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),
2135
:result(0), yacc_yyss(0), yacc_yyvs(0),
2136
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
2139
my_init_dynamic_array2(&plugins, sizeof(plugin_ref),
2140
plugins_static_buffer,
2141
INITIAL_LEX_PLUGIN_LIST_SIZE,
2142
INITIAL_LEX_PLUGIN_LIST_SIZE);
1883
2143
reset_query_tables_list(true);
2148
Check whether the merging algorithm can be used on this VIEW
2151
LEX::can_be_merged()
2154
We can apply merge algorithm if it is single SELECT view with
2155
subqueries only in WHERE clause (we do not count SELECTs of underlying
2156
views, and second level subqueries) and we have not grpouping, ordering,
2157
HAVING clause, aggregate functions, DISTINCT clause, LIMIT clause and
2158
several underlying tables.
2161
false - only temporary table algorithm can be used
2162
true - merge algorithm can be used
2165
bool LEX::can_be_merged()
2167
// TODO: do not forget implement case when select_lex.table_list.elements==0
2169
/* find non VIEW subqueries/unions */
2170
bool selects_allow_merge= select_lex.next_select() == 0;
2171
if (selects_allow_merge)
2173
for (SELECT_LEX_UNIT *tmp_unit= select_lex.first_inner_unit();
2175
tmp_unit= tmp_unit->next_unit())
2177
if (tmp_unit->first_select()->parent_lex == this &&
2178
(tmp_unit->item == 0 ||
2179
(tmp_unit->item->place() != IN_WHERE &&
2180
tmp_unit->item->place() != IN_ON)))
2182
selects_allow_merge= 0;
2188
return (selects_allow_merge &&
2189
select_lex.group_list.elements == 0 &&
2190
select_lex.having == 0 &&
2191
select_lex.with_sum_func == 0 &&
2192
select_lex.table_list.elements >= 1 &&
2193
!(select_lex.options & SELECT_DISTINCT) &&
2194
select_lex.select_limit == 0);
2199
check if command can use VIEW with MERGE algorithm (for top VIEWs)
2202
LEX::can_use_merged()
2205
Only listed here commands can use merge algorithm in top level
2206
SELECT_LEX (for subqueries will be used merge algorithm if
2207
LEX::can_not_use_merged() is not true).
2210
false - command can't use merged VIEWs
2211
true - VIEWs with MERGE algorithms can be used
2214
bool LEX::can_use_merged()
2216
switch (sql_command)
2219
case SQLCOM_CREATE_TABLE:
2221
case SQLCOM_UPDATE_MULTI:
2223
case SQLCOM_DELETE_MULTI:
2225
case SQLCOM_INSERT_SELECT:
2226
case SQLCOM_REPLACE:
2227
case SQLCOM_REPLACE_SELECT:
2236
Check if command can't use merged views in any part of command
2239
LEX::can_not_use_merged()
2242
Temporary table algorithm will be used on all SELECT levels for queries
2243
listed here (see also LEX::can_use_merged()).
2246
false - command can't use merged VIEWs
2247
true - VIEWs with MERGE algorithms can be used
2250
bool LEX::can_not_use_merged()
2252
switch (sql_command)
2255
SQLCOM_SHOW_FIELDS is necessary to make
2256
information schema tables working correctly with views.
2257
see get_schema_tables_result function
2259
case SQLCOM_SHOW_FIELDS:
2267
Detect that we need only table structure of derived table/view
2270
only_view_structure()
2273
true yes, we need only structure
2274
false no, we need data
2277
bool LEX::only_view_structure()
2279
switch (sql_command) {
2280
case SQLCOM_SHOW_CREATE:
2281
case SQLCOM_SHOW_TABLES:
2282
case SQLCOM_SHOW_FIELDS:
2291
Should Items_ident be printed correctly
2294
need_correct_ident()
2297
true yes, we need only structure
2298
false no, we need data
2302
bool LEX::need_correct_ident()
2306
case SQLCOM_SHOW_CREATE:
2307
case SQLCOM_SHOW_TABLES:
1887
2316
This method should be called only during parsing.
1888
2317
It is aware of compound statements (stored routine bodies)
1889
2318
and will initialize the destination with the default
1890
2319
database of the stored routine, rather than the default
1891
2320
database of the connection it is parsed in.
1892
E.g. if one has no current database selected, or current database
2321
E.g. if one has no current database selected, or current database
1893
2322
set to 'bar' and then issues:
1895
2324
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
2536
Save current state of Query_tables_list for this LEX, and prepare it
2537
for processing of new statemnt.
2540
reset_n_backup_query_tables_list()
2541
backup Pointer to Query_tables_list instance to be used for backup
2544
void LEX::reset_n_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
2550
Restore state of Query_tables_list for this LEX from backup.
2553
restore_backup_query_tables_list()
2554
backup Pointer to Query_tables_list instance used for backup
2557
void LEX::restore_backup_query_tables_list(Query_tables_list *backup __attribute__((unused)))
2563
Checks for usage of routines and/or tables in a parsed statement
2566
st_lex:table_or_sp_used()
2569
false No routines and tables used
2570
true Either or both routines and tables are used.
2573
bool LEX::table_or_sp_used()
2575
if (sroutines.records || query_tables)
2583
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
2586
fix_prepare_info_in_table_list()
2587
session Thread handle
2588
tbl List of tables to process
2591
Perform end-end-of prepare fixup for list of tables, if any of the tables
2592
is a merge-algorithm VIEW, recursively fix up its underlying tables as
2597
static void fix_prepare_info_in_table_list(Session *session, TableList *tbl)
2599
for (; tbl; tbl= tbl->next_local)
2603
tbl->prep_on_expr= tbl->on_expr;
2604
tbl->on_expr= tbl->on_expr->copy_andor_structure(session);
2606
fix_prepare_info_in_table_list(session, tbl->merge_underlying_list);
2612
There are st_select_lex::add_table_to_list &
2613
st_select_lex::set_lock_for_tables are in sql_parse.cc
2615
st_select_lex::print is in sql_select.cc
2617
st_select_lex_unit::prepare, st_select_lex_unit::exec,
2618
st_select_lex_unit::cleanup, st_select_lex_unit::reinit_exec_mechanism,
2619
st_select_lex_unit::change_result
2102
2620
are in sql_union.cc