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
340
lip->yyUnget(); // ptr points now after last token char
362
341
tmp.length= lip->yytoklen=length;
363
tmp.str=(char*) lip->m_session->getMemRoot()->allocate(tmp.length+1);
342
tmp.str=(char*) lip->m_session->alloc(tmp.length+1);
364
343
from= lip->get_tok_start() + skip;
388
367
static char *get_text(Lex_input_stream *lip, int pre_skip, int post_skip)
369
register unsigned char c,sep;
391
370
bool found_escape= false;
392
371
const CHARSET_INFO * const cs= lip->m_session->charset();
603
582
} /* namespace drizzled */
605
base_sql_lex remember the following states from the following sql_baselex()
584
DRIZZLElex remember the following states from the following DRIZZLElex()
607
586
- MY_LEX_EOQ Found end of query
608
587
- MY_LEX_OPERATOR_OR_IDENT Last state was an ident, text or number
609
588
(which can't be followed by a signed number)
611
int base_sql_lex(union ParserType *yylval, drizzled::Session *session)
590
int DRIZZLElex(void *arg, void *yysession)
592
drizzled::Session *session= (drizzled::Session *)yysession;
613
593
drizzled::Lex_input_stream *lip= session->m_lip;
594
YYSTYPE *yylval=(YYSTYPE*) arg;
616
597
if (lip->lookahead_token != END_OF_INPUT)
637
618
to transform the grammar into a LALR(1) grammar,
638
619
which sql_yacc.yy can process.
640
token= drizzled::lex_one_token(yylval, session);
621
token= drizzled::lex_one_token(arg, yysession);
641
622
if (token == ROLLUP_SYM)
643
624
return WITH_ROLLUP_SYM;
662
643
namespace drizzled
665
int lex_one_token(ParserType *yylval, drizzled::Session *session)
646
int lex_one_token(void *arg, void *yysession)
667
unsigned char c= 0; /* Just set to shutup GCC */
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;
1579
1562
s && s != last;
1580
1563
s= s->outer_select())
1582
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1565
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1584
1567
// Select is dependent of outer select
1585
s->uncacheable.set(UNCACHEABLE_DEPENDENT);
1586
s->uncacheable.set(UNCACHEABLE_UNITED);
1568
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1569
UNCACHEABLE_DEPENDENT;
1587
1570
Select_Lex_Unit *munit= s->master_unit();
1588
munit->uncacheable.set(UNCACHEABLE_UNITED);
1589
munit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1571
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1572
UNCACHEABLE_DEPENDENT;
1590
1573
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);
1576
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1577
sl->uncacheable|= UNCACHEABLE_UNITED;
1597
1580
s->is_correlated= true;
1616
1599
List<Item>* Select_Lex_Node::get_item_list()
1617
1600
{ return NULL; }
1619
TableList *Select_Lex_Node::add_table_to_list(Session *,
1622
const bitset<NUM_OF_TABLE_OPTIONS>&,
1602
TableList *Select_Lex_Node::add_table_to_list (Session *, Table_ident *, LEX_STRING *, uint32_t,
1603
thr_lock_type, List<Index_hint> *, LEX_STRING *)
1608
uint32_t Select_Lex_Node::get_table_join_options()
1632
1614
prohibit using LIMIT clause
1744
1730
str->append(STRING_WITH_LEN(" order by "));
1745
1731
fake_select_lex->print_order(
1747
(Order *) fake_select_lex->order_list.first,
1733
(order_st *) fake_select_lex->order_list.first,
1750
1736
fake_select_lex->print_limit(session, str, query_type);
1801
@brief Restore the LEX and Session in case of a parse error.
1803
This is a clean up call that is invoked by the Bison generated
1804
parser before returning an error from DRIZZLEparse. If your
1805
semantic actions manipulate with the global thread state (which
1806
is a very bad practice and should not normally be employed) and
1807
need a clean-up in case of error, and you can not use %destructor
1808
rule in the grammar file itself, this function should be used
1809
to implement the clean up.
1811
void LEX::cleanup_lex_after_parse_error(Session *)
1816
delete _create_table;
1863
1859
statement parsing. On should use lex_start() function to prepare LEX
1873
1868
sql_command(SQLCOM_END),
1875
1869
option_type(OPT_DEFAULT),
1878
sum_expr_used(false),
1879
_create_table(NULL),
1880
_create_field(NULL),
1883
1872
reset_query_tables_list(true);
1877
Detect that we need only table structure of derived table/view
1880
only_view_structure()
1883
true yes, we need only structure
1884
false no, we need data
1886
bool LEX::only_view_structure()
1888
if (sql_command == SQLCOM_SHOW_CREATE)
1895
Should Items_ident be printed correctly
1898
need_correct_ident()
1901
true yes, we need only structure
1902
false no, we need data
1904
bool LEX::need_correct_ident()
1906
if (sql_command== SQLCOM_SHOW_CREATE)
2068
2094
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
2097
session->lex->derived_tables & additional units may be set if we open
2098
a view. It is necessary to clear session->lex->derived_tables flag
2073
2099
to prevent processing of derived tables during next openTablesLock
2074
2100
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
2101
NOTE: all units will be connected to session->lex->select_lex, because we
2076
2102
have not UNION on most upper level.
2078
2104
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
2185
} /* namespace drizzled */