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
20
#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>
21
#include "drizzled/configmake.h"
22
#include "drizzled/item/num.h"
23
#include "drizzled/error.h"
24
#include "drizzled/session.h"
25
#include "drizzled/sql_base.h"
26
#include "drizzled/lookup_symbol.h"
27
#include "drizzled/index_hint.h"
39
32
using namespace std;
41
34
/* Stay outside of the namespace because otherwise bison goes nuts */
42
int base_sql_lex(ParserType *arg, drizzled::Session *yysession);
35
int DRIZZLElex(void *arg, void *yysession);
47
static int lex_one_token(ParserType *arg, drizzled::Session *yysession);
40
static int lex_one_token(void *arg, void *yysession);
50
43
save order by and tables in own lists.
52
45
static bool add_to_list(Session *session, SQL_LIST &list, Item *item, bool asc)
56
if (!(order = (Order *) session->getMemRoot()->allocate(sizeof(Order))))
48
if (!(order = (order_st *) session->alloc(sizeof(order_st))))
59
50
order->item_ptr= item;
60
51
order->item= &order->item_ptr;
64
55
order->counter_used= 0;
65
list.link_in_list((unsigned char*) order, (unsigned char**) &order->next);
56
list.link_in_list((unsigned char*) order,(unsigned char**) &order->next);
125
115
(m_buf_length / default_charset_info->mbminlen) *
126
116
my_charset_utf8_bin.mbmaxlen;
128
m_body_utf8= (char *) session->getMemRoot()->allocate(body_utf8_length + 1);
118
m_body_utf8= (char *) session->alloc(body_utf8_length + 1);
129
119
m_body_utf8_ptr= m_body_utf8;
130
120
*m_body_utf8_ptr= 0;
216
206
Because of this, it's critical to not do too much things here.
217
207
(We already do too much here)
219
void LEX::start(Session *arg)
224
209
void lex_start(Session *session)
226
LEX *lex= session->getLex();
211
LEX *lex= session->lex;
228
213
lex->session= lex->unit.session= session;
230
lex->context_stack.clear();
215
lex->context_stack.empty();
231
216
lex->unit.init_query();
232
217
lex->unit.init_select();
233
218
/* 'parent_lex' is used in init_query() so it must be before it. */
234
219
lex->select_lex.parent_lex= lex;
235
220
lex->select_lex.init_query();
236
lex->value_list.clear();
237
lex->update_list.clear();
238
lex->auxiliary_table_list.clear();
221
lex->value_list.empty();
222
lex->update_list.empty();
223
lex->auxiliary_table_list.empty();
239
224
lex->unit.next= lex->unit.master=
240
225
lex->unit.link_next= lex->unit.return_to= 0;
241
226
lex->unit.prev= lex->unit.link_prev= 0;
247
232
lex->select_lex.link_prev= (Select_Lex_Node**)&(lex->all_selects_list);
248
233
lex->select_lex.options= 0;
249
234
lex->select_lex.init_order();
250
lex->select_lex.group_list.clear();
235
lex->select_lex.group_list.empty();
251
236
lex->describe= 0;
252
237
lex->derived_tables= 0;
253
238
lex->lock_option= TL_READ;
254
239
lex->leaf_tables_insert= 0;
255
lex->var_list.clear();
256
240
lex->select_lex.select_number= 1;
258
242
lex->select_lex.in_sum_expr=0;
259
lex->select_lex.group_list.clear();
260
lex->select_lex.order_list.clear();
243
lex->select_lex.group_list.empty();
244
lex->select_lex.order_list.empty();
261
245
lex->sql_command= SQLCOM_END;
262
246
lex->duplicates= DUP_ERROR;
361
338
lip->yyUnget(); // ptr points now after last token char
362
339
tmp.length= lip->yytoklen=length;
363
tmp.str=(char*) lip->m_session->getMemRoot()->allocate(tmp.length+1);
340
tmp.str=(char*) lip->m_session->alloc(tmp.length+1);
364
341
from= lip->get_tok_start() + skip;
388
365
static char *get_text(Lex_input_stream *lip, int pre_skip, int post_skip)
367
register unsigned char c,sep;
391
368
bool found_escape= false;
392
369
const CHARSET_INFO * const cs= lip->m_session->charset();
603
580
} /* namespace drizzled */
605
base_sql_lex remember the following states from the following sql_baselex()
582
DRIZZLElex remember the following states from the following DRIZZLElex()
607
584
- MY_LEX_EOQ Found end of query
608
585
- MY_LEX_OPERATOR_OR_IDENT Last state was an ident, text or number
609
586
(which can't be followed by a signed number)
611
int base_sql_lex(union ParserType *yylval, drizzled::Session *session)
588
int DRIZZLElex(void *arg, void *yysession)
590
drizzled::Session *session= (drizzled::Session *)yysession;
613
591
drizzled::Lex_input_stream *lip= session->m_lip;
592
YYSTYPE *yylval=(YYSTYPE*) arg;
616
595
if (lip->lookahead_token != END_OF_INPUT)
637
616
to transform the grammar into a LALR(1) grammar,
638
617
which sql_yacc.yy can process.
640
token= drizzled::lex_one_token(yylval, session);
619
token= drizzled::lex_one_token(arg, yysession);
641
620
if (token == ROLLUP_SYM)
643
622
return WITH_ROLLUP_SYM;
662
641
namespace drizzled
665
int lex_one_token(ParserType *yylval, drizzled::Session *session)
644
int lex_one_token(void *arg, void *yysession)
667
unsigned char c= 0; /* Just set to shutup GCC */
646
register unsigned char c= 0; /* Just set to shutup GCC */
668
647
bool comment_closed;
669
648
int tokval, result_state;
670
649
unsigned int length;
671
650
enum my_lex_states state;
651
Session *session= (Session *)yysession;
672
652
Lex_input_stream *lip= session->m_lip;
673
LEX *lex= session->getLex();
653
LEX *lex= session->lex;
654
YYSTYPE *yylval=(YYSTYPE*) arg;
674
655
const CHARSET_INFO * const cs= session->charset();
675
656
unsigned char *state_map= cs->state_map;
676
657
unsigned char *ident_map= cs->ident_map;
1579
1560
s && s != last;
1580
1561
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1563
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1565
// Select is dependent of outer select
1585
s->uncacheable.set(UNCACHEABLE_DEPENDENT);
1586
s->uncacheable.set(UNCACHEABLE_UNITED);
1566
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1567
UNCACHEABLE_DEPENDENT;
1587
1568
Select_Lex_Unit *munit= s->master_unit();
1588
munit->uncacheable.set(UNCACHEABLE_UNITED);
1589
munit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1569
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1570
UNCACHEABLE_DEPENDENT;
1590
1571
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);
1574
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1575
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1578
s->is_correlated= true;
1616
1597
List<Item>* Select_Lex_Node::get_item_list()
1617
1598
{ return NULL; }
1619
TableList *Select_Lex_Node::add_table_to_list(Session *,
1622
const bitset<NUM_OF_TABLE_OPTIONS>&,
1600
TableList *Select_Lex_Node::add_table_to_list (Session *, Table_ident *, LEX_STRING *, uint32_t,
1601
thr_lock_type, List<Index_hint> *, LEX_STRING *)
1606
uint32_t Select_Lex_Node::get_table_join_options()
1632
1612
prohibit using LIMIT clause
1744
1728
str->append(STRING_WITH_LEN(" order by "));
1745
1729
fake_select_lex->print_order(
1747
(Order *) fake_select_lex->order_list.first,
1731
(order_st *) fake_select_lex->order_list.first,
1750
1734
fake_select_lex->print_limit(session, str, query_type);
1799
@brief Restore the LEX and Session in case of a parse error.
1801
This is a clean up call that is invoked by the Bison generated
1802
parser before returning an error from DRIZZLEparse. If your
1803
semantic actions manipulate with the global thread state (which
1804
is a very bad practice and should not normally be employed) and
1805
need a clean-up in case of error, and you can not use %destructor
1806
rule in the grammar file itself, this function should be used
1807
to implement the clean up.
1809
void LEX::cleanup_lex_after_parse_error(Session *)
1816
delete _create_table;
1863
1857
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),
1861
:result(0), yacc_yyss(0), yacc_yyvs(0),
1862
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
1883
1864
reset_query_tables_list(true);
1869
Detect that we need only table structure of derived table/view
1872
only_view_structure()
1875
true yes, we need only structure
1876
false no, we need data
1878
bool LEX::only_view_structure()
1880
if (sql_command == SQLCOM_SHOW_CREATE)
1887
Should Items_ident be printed correctly
1890
need_correct_ident()
1893
true yes, we need only structure
1894
false no, we need data
1896
bool LEX::need_correct_ident()
1898
if (sql_command== SQLCOM_SHOW_CREATE)
2068
2086
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
2089
session->lex->derived_tables & additional units may be set if we open
2090
a view. It is necessary to clear session->lex->derived_tables flag
2073
2091
to prevent processing of derived tables during next openTablesLock
2074
2092
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
2093
NOTE: all units will be connected to session->lex->select_lex, because we
2076
2094
have not UNION on most upper level.
2078
2096
if (all_selects_list != &select_lex)
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
2177
} /* namespace drizzled */