17
17
/* A lexical scanner on a temporary buffer with a yacc interface */
21
21
#define DRIZZLE_LEX 1
23
#include <drizzled/sql_reserved_words.h>
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>
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"
39
36
using namespace std;
41
38
/* Stay outside of the namespace because otherwise bison goes nuts */
42
int base_sql_lex(ParserType *arg, drizzled::Session *yysession);
39
int DRIZZLElex(void *arg, void *yysession);
47
static int lex_one_token(ParserType *arg, drizzled::Session *yysession);
44
static int lex_one_token(void *arg, void *yysession);
50
47
save order by and tables in own lists.
125
122
(m_buf_length / default_charset_info->mbminlen) *
126
123
my_charset_utf8_bin.mbmaxlen;
128
m_body_utf8= (char *) session->getMemRoot()->allocate(body_utf8_length + 1);
125
m_body_utf8= (char *) session->alloc(body_utf8_length + 1);
129
126
m_body_utf8_ptr= m_body_utf8;
130
127
*m_body_utf8_ptr= 0;
224
221
void lex_start(Session *session)
226
LEX *lex= session->getLex();
223
LEX *lex= session->lex;
228
225
lex->session= lex->unit.session= session;
230
lex->context_stack.clear();
227
lex->context_stack.empty();
231
228
lex->unit.init_query();
232
229
lex->unit.init_select();
233
230
/* 'parent_lex' is used in init_query() so it must be before it. */
234
231
lex->select_lex.parent_lex= lex;
235
232
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
233
lex->value_list.empty();
234
lex->update_list.empty();
235
lex->auxiliary_table_list.empty();
239
236
lex->unit.next= lex->unit.master=
240
237
lex->unit.link_next= lex->unit.return_to= 0;
241
238
lex->unit.prev= lex->unit.link_prev= 0;
247
244
lex->select_lex.link_prev= (Select_Lex_Node**)&(lex->all_selects_list);
248
245
lex->select_lex.options= 0;
249
246
lex->select_lex.init_order();
250
lex->select_lex.group_list.clear();
247
lex->select_lex.group_list.empty();
251
248
lex->describe= 0;
252
249
lex->derived_tables= 0;
253
250
lex->lock_option= TL_READ;
256
253
lex->select_lex.select_number= 1;
258
255
lex->select_lex.in_sum_expr=0;
259
lex->select_lex.group_list.clear();
260
lex->select_lex.order_list.clear();
256
lex->select_lex.group_list.empty();
257
lex->select_lex.order_list.empty();
261
258
lex->sql_command= SQLCOM_END;
262
259
lex->duplicates= DUP_ERROR;
361
359
lip->yyUnget(); // ptr points now after last token char
362
360
tmp.length= lip->yytoklen=length;
363
tmp.str=(char*) lip->m_session->getMemRoot()->allocate(tmp.length+1);
361
tmp.str=(char*) lip->m_session->alloc(tmp.length+1);
364
362
from= lip->get_tok_start() + skip;
388
386
static char *get_text(Lex_input_stream *lip, int pre_skip, int post_skip)
388
register unsigned char c,sep;
391
389
bool found_escape= false;
392
390
const CHARSET_INFO * const cs= lip->m_session->charset();
437
435
assert(end >= str);
439
if (!(start= (char*) lip->m_session->getMemRoot()->allocate((uint32_t) (end-str)+1)))
437
if (!(start= (char*) lip->m_session->alloc((uint32_t) (end-str)+1)))
440
438
return (char*) ""; // memory::SqlAlloc has set error flag
442
440
lip->m_cpp_text_start= lip->get_cpp_tok_start() + pre_skip;
603
601
} /* namespace drizzled */
605
base_sql_lex remember the following states from the following sql_baselex()
603
DRIZZLElex remember the following states from the following DRIZZLElex()
607
605
- MY_LEX_EOQ Found end of query
608
606
- MY_LEX_OPERATOR_OR_IDENT Last state was an ident, text or number
609
607
(which can't be followed by a signed number)
611
int base_sql_lex(union ParserType *yylval, drizzled::Session *session)
609
int DRIZZLElex(void *arg, void *yysession)
611
drizzled::Session *session= (drizzled::Session *)yysession;
613
612
drizzled::Lex_input_stream *lip= session->m_lip;
613
YYSTYPE *yylval=(YYSTYPE*) arg;
616
616
if (lip->lookahead_token != END_OF_INPUT)
637
637
to transform the grammar into a LALR(1) grammar,
638
638
which sql_yacc.yy can process.
640
token= drizzled::lex_one_token(yylval, session);
640
token= drizzled::lex_one_token(arg, yysession);
641
641
if (token == ROLLUP_SYM)
643
643
return WITH_ROLLUP_SYM;
662
662
namespace drizzled
665
int lex_one_token(ParserType *yylval, drizzled::Session *session)
665
int lex_one_token(void *arg, void *yysession)
667
unsigned char c= 0; /* Just set to shutup GCC */
667
register unsigned char c= 0; /* Just set to shutup GCC */
668
668
bool comment_closed;
669
669
int tokval, result_state;
670
670
unsigned int length;
671
671
enum my_lex_states state;
672
Session *session= (Session *)yysession;
672
673
Lex_input_stream *lip= session->m_lip;
673
LEX *lex= session->getLex();
674
LEX *lex= session->lex;
675
YYSTYPE *yylval=(YYSTYPE*) arg;
674
676
const CHARSET_INFO * const cs= session->charset();
675
677
unsigned char *state_map= cs->state_map;
676
678
unsigned char *ident_map= cs->ident_map;
1342
1344
void Select_Lex::init_query()
1344
1346
Select_Lex_Node::init_query();
1346
top_join_list.clear();
1348
top_join_list.empty();
1347
1349
join_list= &top_join_list;
1348
1350
embedding= leaf_tables= 0;
1351
1353
having= where= 0;
1352
1354
olap= UNSPECIFIED_OLAP_TYPE;
1395
1397
select_limit= 0; /* denotes the default limit = HA_POS_ERROR */
1396
1398
offset_limit= 0; /* denotes the default offset = 0 */
1397
1399
with_sum_func= 0;
1399
1400
is_correlated= 0;
1400
1401
cur_pos_in_select_list= UNDEF_POS;
1401
non_agg_fields.clear();
1402
non_agg_fields.empty();
1402
1403
cond_value= having_value= Item::COND_UNDEF;
1403
inner_refs_list.clear();
1404
inner_refs_list.empty();
1404
1405
full_group_by_flag.reset();
2068
2069
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
2072
session->lex->derived_tables & additional units may be set if we open
2073
a view. It is necessary to clear session->lex->derived_tables flag
2073
2074
to prevent processing of derived tables during next openTablesLock
2074
2075
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
2076
NOTE: all units will be connected to session->lex->select_lex, because we
2076
2077
have not UNION on most upper level.
2078
2079
if (all_selects_list != &select_lex)