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 */
20
19
#define DRIZZLE_LEX 1
21
#include "drizzled/configmake.h"
20
#include "drizzled/server_includes.h"
22
21
#include "drizzled/item/num.h"
23
22
#include "drizzled/error.h"
24
23
#include "drizzled/session.h"
26
25
#include "drizzled/lookup_symbol.h"
27
26
#include "drizzled/index_hint.h"
32
30
using namespace std;
34
/* Stay outside of the namespace because otherwise bison goes nuts */
32
static int lex_one_token(void *arg, void *yysession);
35
33
int DRIZZLElex(void *arg, void *yysession);
40
static int lex_one_token(void *arg, void *yysession);
43
save order by and tables in own lists.
36
We are using pointer to this variable for distinguishing between assignment
37
to NEW row field (when parsing trigger definition) and structured variable.
45
static bool add_to_list(Session *session, SQL_LIST &list, Item *item, bool asc)
48
if (!(order = (Order *) session->alloc(sizeof(Order))))
50
order->item_ptr= item;
51
order->item= &order->item_ptr;
55
order->counter_used= 0;
56
list.link_in_list((unsigned char*) order,(unsigned char**) &order->next);
39
sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
61
42
LEX_STRING constant for null-string to be used in parser and other places.
225
202
lex->select_lex.init_query();
226
203
lex->value_list.empty();
227
204
lex->update_list.empty();
205
lex->param_list.empty();
228
206
lex->auxiliary_table_list.empty();
229
207
lex->unit.next= lex->unit.master=
230
208
lex->unit.link_next= lex->unit.return_to= 0;
263
241
lex->in_sum_func= NULL;
265
243
lex->is_lex_started= true;
266
lex->statement= NULL;
268
lex->is_cross= false;
244
lex->create_table_proto= NULL;
247
void lex_end(LEX *lex)
251
free(lex->yacc_yyss);
252
free(lex->yacc_yyvs);
259
if(lex->create_table_proto)
260
delete lex->create_table_proto;
292
264
static int find_keyword(Lex_input_stream *lip, uint32_t len, bool function)
424
396
assert(end >= str);
426
398
if (!(start= (char*) lip->m_session->alloc((uint32_t) (end-str)+1)))
427
return (char*) ""; // memory::SqlAlloc has set error flag
399
return (char*) ""; // Sql_alloc has set error flag
429
401
lip->m_cpp_text_start= lip->get_cpp_tok_start() + pre_skip;
430
402
lip->m_cpp_text_end= lip->get_cpp_ptr() - post_skip;
598
569
int DRIZZLElex(void *arg, void *yysession)
600
drizzled::Session *session= (drizzled::Session *)yysession;
601
drizzled::Lex_input_stream *lip= session->m_lip;
571
Session *session= (Session *)yysession;
572
Lex_input_stream *lip= session->m_lip;
602
573
YYSTYPE *yylval=(YYSTYPE*) arg;
626
597
to transform the grammar into a LALR(1) grammar,
627
598
which sql_yacc.yy can process.
629
token= drizzled::lex_one_token(arg, yysession);
600
token= lex_one_token(arg, yysession);
630
601
if (token == ROLLUP_SYM)
632
603
return WITH_ROLLUP_SYM;
1245
Construct a copy of this object to be used for mysql_alter_table
1246
and mysql_create_table.
1248
Historically, these two functions modify their Alter_info
1249
arguments. This behaviour breaks re-execution of prepared
1250
statements and stored procedures and is compensated by always
1251
supplying a copy of Alter_info to these functions.
1253
@return You need to use check the error in Session for out
1254
of memory condition after calling this function.
1256
Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
1257
:drop_list(rhs.drop_list, mem_root),
1258
alter_list(rhs.alter_list, mem_root),
1259
key_list(rhs.key_list, mem_root),
1260
create_list(rhs.create_list, mem_root),
1262
keys_onoff(rhs.keys_onoff),
1263
tablespace_op(rhs.tablespace_op),
1264
no_parts(rhs.no_parts),
1265
build_method(rhs.build_method),
1266
datetime_field(rhs.datetime_field),
1267
error_if_not_empty(rhs.error_if_not_empty)
1270
Make deep copies of used objects.
1271
This is not a fully deep copy - clone() implementations
1272
of Alter_drop, Alter_column, Key, foreign_key, Key_part_spec
1273
do not copy string constants. At the same length the only
1274
reason we make a copy currently is that ALTER/CREATE TABLE
1275
code changes input Alter_info definitions, but string
1276
constants never change.
1278
list_copy_and_replace_each_value(drop_list, mem_root);
1279
list_copy_and_replace_each_value(alter_list, mem_root);
1280
list_copy_and_replace_each_value(key_list, mem_root);
1281
list_copy_and_replace_each_value(create_list, mem_root);
1276
1284
void trim_whitespace(const CHARSET_INFO * const cs, LEX_STRING *str)
1569
1578
s && s != last;
1570
1579
s= s->outer_select())
1572
if (! (s->uncacheable.test(UNCACHEABLE_DEPENDENT)))
1581
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
1574
1583
// Select is dependent of outer select
1575
s->uncacheable.set(UNCACHEABLE_DEPENDENT);
1576
s->uncacheable.set(UNCACHEABLE_UNITED);
1584
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
1585
UNCACHEABLE_DEPENDENT;
1577
1586
Select_Lex_Unit *munit= s->master_unit();
1578
munit->uncacheable.set(UNCACHEABLE_UNITED);
1579
munit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1587
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
1588
UNCACHEABLE_DEPENDENT;
1580
1589
for (Select_Lex *sl= munit->first_select(); sl ; sl= sl->next_select())
1583
! (sl->uncacheable.test(UNCACHEABLE_DEPENDENT) && sl->uncacheable.test(UNCACHEABLE_UNITED)))
1584
sl->uncacheable.set(UNCACHEABLE_UNITED);
1592
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
1593
sl->uncacheable|= UNCACHEABLE_UNITED;
1587
1596
s->is_correlated= true;
1606
1615
List<Item>* Select_Lex_Node::get_item_list()
1607
1616
{ return NULL; }
1609
TableList *Select_Lex_Node::add_table_to_list(Session *,
1612
const bitset<NUM_OF_TABLE_OPTIONS>&,
1618
TableList *Select_Lex_Node::add_table_to_list (Session *, Table_ident *, LEX_STRING *, uint32_t,
1619
thr_lock_type, List<Index_hint> *, LEX_STRING *)
1624
uint32_t Select_Lex_Node::get_table_join_options()
1622
1630
prohibit using LIMIT clause
1734
1746
str->append(STRING_WITH_LEN(" order by "));
1735
1747
fake_select_lex->print_order(
1737
(Order *) fake_select_lex->order_list.first,
1749
(order_st *) fake_select_lex->order_list.first,
1740
1752
fake_select_lex->print_limit(session, str, query_type);
1872
sql_command(SQLCOM_END),
1873
option_type(OPT_DEFAULT),
1876
sum_expr_used(false)
1879
:result(0), yacc_yyss(0), yacc_yyvs(0),
1880
sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
1878
1882
reset_query_tables_list(true);
1883
create_table_proto= NULL;
1887
Detect that we need only table structure of derived table/view
1890
only_view_structure()
1893
true yes, we need only structure
1894
false no, we need data
1896
bool LEX::only_view_structure()
1898
switch (sql_command) {
1899
case SQLCOM_SHOW_CREATE:
1900
case SQLCOM_SHOW_TABLES:
1901
case SQLCOM_SHOW_FIELDS:
1909
Should Items_ident be printed correctly
1912
need_correct_ident()
1915
true yes, we need only structure
1916
false no, we need data
1918
bool LEX::need_correct_ident()
1922
case SQLCOM_SHOW_CREATE:
1923
case SQLCOM_SHOW_TABLES:
2067
2115
session->lex->derived_tables & additional units may be set if we open
2068
2116
a view. It is necessary to clear session->lex->derived_tables flag
2069
to prevent processing of derived tables during next openTablesLock
2117
to prevent processing of derived tables during next open_and_lock_tables
2070
2118
if next table is a real table and cleanup & remove underlying units
2071
2119
NOTE: all units will be connected to session->lex->select_lex, because we
2072
2120
have not UNION on most upper level.