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>
20
#include "drizzled/server_includes.h"
21
#include "drizzled/item/num.h"
22
#include "drizzled/error.h"
23
#include "drizzled/session.h"
24
#include "drizzled/sql_base.h"
25
#include "drizzled/lookup_symbol.h"
26
#include "drizzled/index_hint.h"
39
30
using namespace std;
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);
32
static int lex_one_token(void *arg, void *yysession);
33
int DRIZZLElex(void *arg, void *yysession);
50
36
save order by and tables in own lists.
52
38
static bool add_to_list(Session *session, SQL_LIST &list, Item *item, bool asc)
56
if (!(order = (Order *) session->getMemRoot()->allocate(sizeof(Order))))
41
if (!(order = (order_st *) session->alloc(sizeof(order_st))))
59
43
order->item_ptr= item;
60
44
order->item= &order->item_ptr;
64
48
order->counter_used= 0;
65
list.link_in_list((unsigned char*) order, (unsigned char**) &order->next);
49
list.link_in_list((unsigned char*) order,(unsigned char**) &order->next);
56
We are using pointer to this variable for distinguishing between assignment
57
to NEW row field (when parsing trigger definition) and structured variable.
59
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
71
62
LEX_STRING constant for null-string to be used in parser and other places.
216
208
Because of this, it's critical to not do too much things here.
217
209
(We already do too much here)
219
void LEX::start(Session *arg)
224
211
void lex_start(Session *session)
226
LEX *lex= session->getLex();
213
LEX *lex= session->lex;
228
215
lex->session= lex->unit.session= session;
230
lex->context_stack.clear();
217
lex->context_stack.empty();
231
218
lex->unit.init_query();
232
219
lex->unit.init_select();
233
220
/* 'parent_lex' is used in init_query() so it must be before it. */
234
221
lex->select_lex.parent_lex= lex;
235
222
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
223
lex->value_list.empty();
224
lex->update_list.empty();
225
lex->param_list.empty();
226
lex->auxiliary_table_list.empty();
239
227
lex->unit.next= lex->unit.master=
240
228
lex->unit.link_next= lex->unit.return_to= 0;
241
229
lex->unit.prev= lex->unit.link_prev= 0;
247
235
lex->select_lex.link_prev= (Select_Lex_Node**)&(lex->all_selects_list);
248
236
lex->select_lex.options= 0;
249
237
lex->select_lex.init_order();
250
lex->select_lex.group_list.clear();
238
lex->select_lex.group_list.empty();
251
239
lex->describe= 0;
252
240
lex->derived_tables= 0;
253
241
lex->lock_option= TL_READ;
254
242
lex->leaf_tables_insert= 0;
255
lex->var_list.clear();
256
243
lex->select_lex.select_number= 1;
258
245
lex->select_lex.in_sum_expr=0;
259
lex->select_lex.group_list.clear();
260
lex->select_lex.order_list.clear();
246
lex->select_lex.group_list.empty();
247
lex->select_lex.order_list.empty();
261
248
lex->sql_command= SQLCOM_END;
262
249
lex->duplicates= DUP_ERROR;
272
259
lex->nest_level=0 ;
273
260
lex->allow_sum_func= 0;
274
261
lex->in_sum_func= NULL;
277
263
lex->is_lex_started= true;
264
lex->create_table_proto= NULL;
278
265
lex->statement= NULL;
280
lex->is_cross= false;
268
void lex_end(LEX *lex)
272
free(lex->yacc_yyss);
273
free(lex->yacc_yyvs);
295
safe_delete(_create_table);
302
safe_delete(statement);
280
if(lex->create_table_proto)
281
delete lex->create_table_proto;
285
delete lex->statement;
305
288
static int find_keyword(Lex_input_stream *lip, uint32_t len, bool function)
437
420
assert(end >= str);
439
if (!(start= (char*) lip->m_session->getMemRoot()->allocate((uint32_t) (end-str)+1)))
440
return (char*) ""; // memory::SqlAlloc has set error flag
422
if (!(start= (char*) lip->m_session->alloc((uint32_t) (end-str)+1)))
423
return (char*) ""; // Sql_alloc has set error flag
442
425
lip->m_cpp_text_start= lip->get_cpp_tok_start() + pre_skip;
443
426
lip->m_cpp_text_end= lip->get_cpp_ptr() - post_skip;
600
583
return ((unsigned char) str[-1] <= (unsigned char) cmp[-1]) ? smaller : bigger;
603
} /* namespace drizzled */
605
base_sql_lex remember the following states from the following sql_baselex()
587
DRIZZLElex remember the following states from the following DRIZZLElex()
607
589
- MY_LEX_EOQ Found end of query
608
590
- MY_LEX_OPERATOR_OR_IDENT Last state was an ident, text or number
609
591
(which can't be followed by a signed number)
611
int base_sql_lex(union ParserType *yylval, drizzled::Session *session)
593
int DRIZZLElex(void *arg, void *yysession)
613
drizzled::Lex_input_stream *lip= session->m_lip;
595
Session *session= (Session *)yysession;
596
Lex_input_stream *lip= session->m_lip;
597
YYSTYPE *yylval=(YYSTYPE*) arg;
616
600
if (lip->lookahead_token != END_OF_INPUT)
665
int lex_one_token(ParserType *yylval, drizzled::Session *session)
667
unsigned char c= 0; /* Just set to shutup GCC */
646
int lex_one_token(void *arg, void *yysession)
648
register unsigned char c= 0; /* Just set to shutup GCC */
668
649
bool comment_closed;
669
650
int tokval, result_state;
670
651
unsigned int length;
671
652
enum my_lex_states state;
653
Session *session= (Session *)yysession;
672
654
Lex_input_stream *lip= session->m_lip;
673
LEX *lex= session->getLex();
655
LEX *lex= session->lex;
656
YYSTYPE *yylval=(YYSTYPE*) arg;
674
657
const CHARSET_INFO * const cs= session->charset();
675
658
unsigned char *state_map= cs->state_map;
676
659
unsigned char *ident_map= cs->ident_map;
1269
Construct a copy of this object to be used for mysql_alter_table
1270
and mysql_create_table.
1272
Historically, these two functions modify their Alter_info
1273
arguments. This behaviour breaks re-execution of prepared
1274
statements and stored procedures and is compensated by always
1275
supplying a copy of Alter_info to these functions.
1277
@return You need to use check the error in Session for out
1278
of memory condition after calling this function.
1280
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1281
:drop_list(rhs.drop_list, mem_root),
1282
alter_list(rhs.alter_list, mem_root),
1283
key_list(rhs.key_list, mem_root),
1284
create_list(rhs.create_list, mem_root),
1286
keys_onoff(rhs.keys_onoff),
1287
tablespace_op(rhs.tablespace_op),
1288
no_parts(rhs.no_parts),
1289
build_method(rhs.build_method),
1290
datetime_field(rhs.datetime_field),
1291
error_if_not_empty(rhs.error_if_not_empty)
1294
Make deep copies of used objects.
1295
This is not a fully deep copy - clone() implementations
1296
of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1297
do not copy string constants. At the same length the only
1298
reason we make a copy currently is that ALTER/CREATE TABLE
1299
code changes input Alter_info definitions, but string
1300
constants never change.
1302
list_copy_and_replace_each_value(drop_list, mem_root);
1303
list_copy_and_replace_each_value(alter_list, mem_root);
1304
list_copy_and_replace_each_value(key_list, mem_root);
1305
list_copy_and_replace_each_value(create_list, mem_root);
1285
1308
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1579
1602
s && s != last;
1580
1603
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1605
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1607
// Select is dependent of outer select
1585
s->uncacheable.set(UNCACHEABLE_DEPENDENT);
1586
s->uncacheable.set(UNCACHEABLE_UNITED);
1608
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1609
UNCACHEABLE_DEPENDENT;
1587
1610
Select_Lex_Unit *munit= s->master_unit();
1588
munit->uncacheable.set(UNCACHEABLE_UNITED);
1589
munit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1611
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1612
UNCACHEABLE_DEPENDENT;
1590
1613
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);
1616
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1617
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1620
s->is_correlated= true;
1616
1639
List<Item>* Select_Lex_Node::get_item_list()
1617
1640
{ return NULL; }
1619
TableList *Select_Lex_Node::add_table_to_list(Session *,
1622
const bitset<NUM_OF_TABLE_OPTIONS>&,
1642
TableList *Select_Lex_Node::add_table_to_list (Session *, Table_ident *, LEX_STRING *, uint32_t,
1643
thr_lock_type, List<Index_hint> *, LEX_STRING *)
1648
uint32_t Select_Lex_Node::get_table_join_options()
1632
1654
prohibit using LIMIT clause
1744
1770
str->append(STRING_WITH_LEN(" order by "));
1745
1771
fake_select_lex->print_order(
1747
(Order *) fake_select_lex->order_list.first,
1773
(order_st *) fake_select_lex->order_list.first,
1750
1776
fake_select_lex->print_limit(session, str, query_type);
1841
@brief Restore the LEX and Session in case of a parse error.
1843
This is a clean up call that is invoked by the Bison generated
1844
parser before returning an error from DRIZZLEparse. If your
1845
semantic actions manipulate with the global thread state (which
1846
is a very bad practice and should not normally be employed) and
1847
need a clean-up in case of error, and you can not use %destructor
1848
rule in the grammar file itself, this function should be used
1849
to implement the clean up.
1851
void LEX::cleanup_lex_after_parse_error(Session *)
1816
delete _create_table;
1863
1899
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),
1903
:result(0), yacc_yyss(0), yacc_yyvs(0),
1904
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
1883
1906
reset_query_tables_list(true);
1907
create_table_proto= NULL;
1912
Detect that we need only table structure of derived table/view
1915
only_view_structure()
1918
true yes, we need only structure
1919
false no, we need data
1921
bool LEX::only_view_structure()
1923
switch (sql_command) {
1924
case SQLCOM_SHOW_CREATE:
1925
case SQLCOM_SHOW_TABLES:
1926
case SQLCOM_SHOW_FIELDS:
1934
Should Items_ident be printed correctly
1937
need_correct_ident()
1940
true yes, we need only structure
1941
false no, we need data
1943
bool LEX::need_correct_ident()
1947
case SQLCOM_SHOW_CREATE:
1948
case SQLCOM_SHOW_TABLES:
2068
2137
void LEX::cleanup_after_one_table_open()
2071
session->getLex()->derived_tables & additional units may be set if we open
2072
a view. It is necessary to clear session->getLex()->derived_tables flag
2140
session->lex->derived_tables & additional units may be set if we open
2141
a view. It is necessary to clear session->lex->derived_tables flag
2073
2142
to prevent processing of derived tables during next openTablesLock
2074
2143
if next table is a real table and cleanup & remove underlying units
2075
NOTE: all units will be connected to session->getLex()->select_lex, because we
2144
NOTE: all units will be connected to session->lex->select_lex, because we
2076
2145
have not UNION on most upper level.
2078
2147
if (all_selects_list != &select_lex)
2155
2224
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 */