320
static Item* reserved_keyword_function(Session *session, const std::string &name, List<Item> *item_list)
322
const plugin::Function *udf= plugin::Function::get(name.c_str(), name.length());
327
item= Create_udf_func::s_singleton.create(session, udf, item_list);
329
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "FUNCTION", name.c_str());
335
} /* namespace drizzled; */
337
using namespace drizzled;
342
314
uint64_t ulonglong_number;
343
315
int64_t longlong_number;
344
drizzled::LEX_STRING lex_str;
345
drizzled::LEX_STRING *lex_str_ptr;
346
drizzled::LEX_SYMBOL symbol;
347
drizzled::Table_ident *table;
317
LEX_STRING *lex_str_ptr;
348
320
char *simple_string;
349
drizzled::Item *item;
350
drizzled::Item_num *item_num;
351
drizzled::List<drizzled::Item> *item_list;
352
drizzled::List<drizzled::String> *string_list;
353
drizzled::String *string;
354
drizzled::Key_part_spec *key_part;
355
const drizzled::plugin::Function *udf;
356
drizzled::TableList *table_list;
357
struct drizzled::sys_var_with_base variable;
358
enum drizzled::sql_var_t var_type;
359
drizzled::Key::Keytype key_type;
360
enum drizzled::ha_key_alg key_alg;
361
enum drizzled::column_format_type column_format_type;
362
enum drizzled::ha_rkey_function ha_rkey_mode;
363
enum drizzled::enum_tx_isolation tx_isolation;
364
enum drizzled::Cast_target cast_type;
365
const drizzled::CHARSET_INFO *charset;
366
drizzled::thr_lock_type lock_type;
367
drizzled::interval_type interval, interval_time_st;
368
enum drizzled::enum_drizzle_timestamp_type date_time_type;
369
drizzled::Select_Lex *select_lex;
370
drizzled::chooser_compare_func_creator boolfunc2creator;
371
struct drizzled::st_lex *lex;
372
enum drizzled::index_hint_type index_hint;
373
enum drizzled::enum_filetype filetype;
374
enum drizzled::ha_build_method build_method;
375
drizzled::message::Table::ForeignKeyConstraint::ForeignKeyOption m_fk_option;
376
drizzled::execute_string_t execute_string;
323
List<Item> *item_list;
324
List<String> *string_list;
326
Key_part_spec *key_part;
327
TABLE_LIST *table_list;
330
struct sys_var_with_base variable;
331
enum enum_var_type var_type;
332
Key::Keytype key_type;
333
enum ha_key_alg key_alg;
335
enum row_type row_type;
336
enum column_format_type column_format_type;
337
enum ha_rkey_function ha_rkey_mode;
338
enum enum_tx_isolation tx_isolation;
339
enum Cast_target cast_type;
340
enum ha_choice choice;
341
CHARSET_INFO *charset;
342
thr_lock_type lock_type;
343
struct st_table_lock_info table_lock_info;
344
interval_type interval, interval_time_st;
345
timestamp_type date_time_type;
346
st_select_lex *select_lex;
347
chooser_compare_func_creator boolfunc2creator;
348
struct sp_cond_type *spcondtype;
349
struct { int vars, conds, hndlrs, curs; } spblock;
351
struct p_elem_val *p_elem_value;
352
enum index_hint_type index_hint;
353
enum enum_filetype filetype;
354
enum ha_build_method build_method;
355
enum Foreign_key::fk_option m_fk_option;
382
359
bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
386
362
%pure_parser /* We have threads */
388
Currently there are 88 shift/reduce conflicts.
364
Currently there are 100 shift/reduce conflicts.
389
365
We should not introduce new conflicts any more.
394
370
Comments for TOKENS.
1180
CHANGE MASTER_SYM TO_SYM
1183
lex->sql_command = SQLCOM_CHANGE_MASTER;
1184
bzero((char*) &lex->mi, sizeof(lex->mi));
1192
| master_defs ',' master_def
1196
MASTER_HOST_SYM EQ TEXT_STRING_sys
1198
Lex->mi.host = $3.str;
1200
| MASTER_USER_SYM EQ TEXT_STRING_sys
1202
Lex->mi.user = $3.str;
1204
| MASTER_PASSWORD_SYM EQ TEXT_STRING_sys
1206
Lex->mi.password = $3.str;
1208
| MASTER_PORT_SYM EQ ulong_num
1212
| MASTER_CONNECT_RETRY_SYM EQ ulong_num
1214
Lex->mi.connect_retry = $3;
1216
| MASTER_HEARTBEAT_PERIOD_SYM EQ NUM_literal
1218
Lex->mi.heartbeat_period= (float) $3->val_real();
1219
if (Lex->mi.heartbeat_period > SLAVE_MAX_HEARTBEAT_PERIOD ||
1220
Lex->mi.heartbeat_period < 0.0)
1222
char buf[sizeof(SLAVE_MAX_HEARTBEAT_PERIOD*4)];
1223
sprintf(buf, "%d seconds", SLAVE_MAX_HEARTBEAT_PERIOD);
1224
my_error(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE,
1226
" is negative or exceeds the maximum ",
1230
if (Lex->mi.heartbeat_period > slave_net_timeout)
1232
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
1233
ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE,
1234
ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE),
1235
" exceeds the value of `slave_net_timeout' sec.",
1236
" A sensible value for the period should be"
1237
" less than the timeout.");
1239
if (Lex->mi.heartbeat_period < 0.001)
1241
if (Lex->mi.heartbeat_period != 0.0)
1243
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
1244
ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE,
1245
ER(ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE),
1246
" is less than 1 msec.",
1247
" The period is reset to zero which means"
1248
" no heartbeats will be sending");
1249
Lex->mi.heartbeat_period= 0.0;
1251
Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE;
1253
Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE;
1260
MASTER_LOG_FILE_SYM EQ TEXT_STRING_sys
1262
Lex->mi.log_file_name = $3.str;
1264
| MASTER_LOG_POS_SYM EQ ulonglong_num
1268
If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it
1269
instead of causing subsequent errors.
1270
We need to do it in this file, because only there we know that
1271
MASTER_LOG_POS has been explicitely specified. On the contrary
1272
in change_master() (sql_repl.cc) we cannot distinguish between 0
1273
(MASTER_LOG_POS explicitely specified as 0) and 0 (unspecified),
1274
whereas we want to distinguish (specified 0 means "read the binlog
1275
from 0" (4 in fact), unspecified means "don't change the position
1276
(keep the preceding value)").
1278
Lex->mi.pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.pos);
1280
| RELAY_LOG_FILE_SYM EQ TEXT_STRING_sys
1282
Lex->mi.relay_log_name = $3.str;
1284
| RELAY_LOG_POS_SYM EQ ulong_num
1286
Lex->mi.relay_log_pos = $3;
1287
/* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */
1288
Lex->mi.relay_log_pos = max(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos);
1040
1292
/* create a table */
1043
1295
CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident
1045
Session *session= YYSession;
1046
LEX *lex= session->lex;
1047
1299
lex->sql_command= SQLCOM_CREATE_TABLE;
1048
statement::CreateTable *statement= new(std::nothrow) statement::CreateTable(YYSession);
1049
lex->statement= statement;
1050
if (lex->statement == NULL)
1052
if (!lex->select_lex.add_table_to_list(session, $5, NULL,
1300
if (!lex->select_lex.add_table_to_list(thd, $5, NULL,
1053
1301
TL_OPTION_UPDATING,
1304
lex->alter_info.reset();
1056
1305
lex->col_list.empty();
1057
statement->change=NULL;
1058
statement->is_if_not_exists= $4;
1059
statement->create_info.db_type= NULL;
1060
statement->create_info.default_table_charset= NULL;
1307
bzero((char*) &lex->create_info,sizeof(lex->create_info));
1308
lex->create_info.options=$2 | $4;
1309
lex->create_info.db_type= ha_default_handlerton(thd);
1310
lex->create_info.default_table_charset= NULL;
1061
1311
lex->name.str= 0;
1063
message::Table &proto= statement->create_table_message;
1065
proto.set_name($5->table.str);
1067
proto.set_type(message::Table::TEMPORARY);
1069
proto.set_type(message::Table::STANDARD);
1312
lex->name.length= 0;
1073
LEX *lex= YYSession->lex;
1074
lex->current_select= &lex->select_lex;
1316
LEX *lex= YYTHD->lex;
1317
lex->current_select= &lex->select_lex;
1318
if (!lex->create_info.db_type)
1320
lex->create_info.db_type= ha_default_handlerton(YYTHD);
1321
push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
1322
ER_WARN_USING_OTHER_HANDLER,
1323
ER(ER_WARN_USING_OTHER_HANDLER),
1324
ha_resolve_storage_engine_name(lex->create_info.db_type),
1076
| CREATE build_method
1328
| CREATE build_method opt_unique INDEX_SYM ident key_alg
1079
1332
lex->sql_command= SQLCOM_CREATE_INDEX;
1080
statement::CreateIndex *statement= new(std::nothrow) statement::CreateIndex(YYSession);
1081
lex->statement= statement;
1082
if (lex->statement == NULL)
1084
statement->alter_info.flags.set(ALTER_ADD_INDEX);
1085
statement->alter_info.build_method= $2;
1086
lex->col_list.empty();
1087
statement->change=NULL;
1089
opt_unique INDEX_SYM ident key_alg ON table_ident '(' key_list ')' key_options
1092
statement::CreateIndex *statement= (statement::CreateIndex *)Lex->statement;
1094
if (!lex->current_select->add_table_to_list(lex->session, $9,
1333
if (!lex->current_select->add_table_to_list(lex->thd, $8,
1096
1335
TL_OPTION_UPDATING))
1337
lex->alter_info.reset();
1338
lex->alter_info.flags= ALTER_ADD_INDEX;
1339
lex->alter_info.build_method= $2;
1340
lex->col_list.empty();
1343
'(' key_list ')' key_options
1099
key= new Key($4, $6, &statement->key_create_info, 0, lex->col_list);
1100
statement->alter_info.key_list.push_back(key);
1347
key= new Key($3, $5, &lex->key_create_info, 0,
1349
lex->alter_info.key_list.push_back(key);
1101
1350
lex->col_list.empty();
1103
1352
| CREATE DATABASE opt_if_not_exists ident
1354
Lex->create_info.default_table_charset= NULL;
1355
Lex->create_info.used_fields= 0;
1357
opt_create_database_options
1107
1360
lex->sql_command=SQLCOM_CREATE_DB;
1108
statement::CreateSchema *statement= new(std::nothrow) statement::CreateSchema(YYSession);
1109
lex->statement= statement;
1110
if (lex->statement == NULL)
1112
statement->is_if_not_exists= $3;
1114
opt_create_database_options
1362
lex->create_info.options=$3;
1276
1489
create_table_option
1277
1490
| create_table_option create_table_options
1278
1491
| create_table_option ',' create_table_options
1280
1494
create_table_option:
1281
custom_engine_option;
1283
custom_engine_option:
1284
ENGINE_SYM equal ident_or_text
1286
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1288
statement->is_engine_set= true;
1290
((statement::CreateTable *)Lex->statement)->create_table_message.mutable_engine()->set_name($3.str);
1495
ENGINE_SYM opt_equal storage_engines
1497
Lex->create_info.db_type= $3;
1498
Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
1500
| MAX_ROWS opt_equal ulonglong_num
1502
Lex->create_info.max_rows= $3;
1503
Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS;
1505
| MIN_ROWS opt_equal ulonglong_num
1507
Lex->create_info.min_rows= $3;
1508
Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS;
1510
| AVG_ROW_LENGTH opt_equal ulong_num
1512
Lex->create_info.avg_row_length=$3;
1513
Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH;
1292
1515
| COMMENT_SYM opt_equal TEXT_STRING_sys
1294
message::Table::TableOptions *tableopts;
1295
tableopts= ((statement::CreateTable *)Lex->statement)->create_table_message.mutable_options();
1297
tableopts->set_comment($3.str);
1517
Lex->create_info.comment=$3;
1518
Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT;
1299
1520
| AUTO_INC opt_equal ulonglong_num
1301
message::Table::TableOptions *tableopts;
1302
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1304
tableopts= ((statement::CreateTable *)Lex->statement)->create_table_message.mutable_options();
1306
statement->create_info.auto_increment_value=$3;
1307
statement->create_info.used_fields|= HA_CREATE_USED_AUTO;
1308
tableopts->set_auto_increment_value($3);
1310
| ident_or_text equal ident_or_text
1312
drizzled::message::Engine::Option *opt= ((statement::CreateTable *)Lex->statement)->create_table_message.mutable_engine()->add_options();
1314
opt->set_name($1.str);
1315
opt->set_state($3.str);
1317
| ident_or_text equal ulonglong_num
1319
char number_as_string[22];
1320
snprintf(number_as_string, sizeof(number_as_string), "%"PRIu64, $3);
1322
drizzled::message::Engine::Option *opt= ((statement::CreateTable *)Lex->statement)->create_table_message.mutable_engine()->add_options();
1323
opt->set_name($1.str);
1324
opt->set_state(number_as_string);
1522
Lex->create_info.auto_increment_value=$3;
1523
Lex->create_info.used_fields|= HA_CREATE_USED_AUTO;
1525
| PACK_KEYS_SYM opt_equal ulong_num
1529
Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS;
1532
Lex->create_info.table_options|= HA_OPTION_PACK_KEYS;
1535
my_parse_error(ER(ER_SYNTAX_ERROR));
1538
Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS;
1540
| PACK_KEYS_SYM opt_equal DEFAULT
1542
Lex->create_info.table_options&=
1543
~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS);
1544
Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS;
1546
| CHECKSUM_SYM opt_equal ulong_num
1548
Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM;
1549
Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM;
1551
| TABLE_CHECKSUM_SYM opt_equal ulong_num
1553
Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM;
1554
Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM;
1556
| PAGE_CHECKSUM_SYM opt_equal choice
1558
Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM;
1559
Lex->create_info.page_checksum= $3;
1561
| DELAY_KEY_WRITE_SYM opt_equal ulong_num
1563
Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE;
1564
Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE;
1566
| ROW_FORMAT_SYM opt_equal row_types
1568
Lex->create_info.row_type= $3;
1569
Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT;
1570
Lex->alter_info.flags|= ALTER_ROW_FORMAT;
1572
| UNION_SYM opt_equal '(' opt_table_list ')'
1574
/* Move the union list to the merge_list */
1576
TABLE_LIST *table_list= lex->select_lex.get_table_list();
1577
lex->create_info.merge_list= lex->select_lex.table_list;
1578
lex->create_info.merge_list.elements--;
1579
lex->create_info.merge_list.first=
1580
(uchar*) (table_list->next_local);
1581
lex->select_lex.table_list.elements=1;
1582
lex->select_lex.table_list.next=
1583
(uchar**) &(table_list->next_local);
1584
table_list->next_local= 0;
1585
lex->create_info.used_fields|= HA_CREATE_USED_UNION;
1326
1588
| default_collation
1589
| DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys
1591
Lex->create_info.data_file_name= $4.str;
1592
Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR;
1594
| INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys
1596
Lex->create_info.index_file_name= $4.str;
1597
Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR;
1599
| CONNECTION_SYM opt_equal TEXT_STRING_sys
1601
Lex->create_info.connect_string.str= $3.str;
1602
Lex->create_info.connect_string.length= $3.length;
1603
Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION;
1605
| KEY_BLOCK_SIZE opt_equal ulong_num
1607
Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE;
1608
Lex->create_info.key_block_size= $3;
1610
| TRANSACTIONAL_SYM opt_equal choice
1612
Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL;
1613
Lex->create_info.transactional= $3;
1618
opt_default charset opt_equal charset_name_or_default
1620
HA_CREATE_INFO *cinfo= &Lex->create_info;
1621
if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
1622
cinfo->default_table_charset && $4 &&
1623
!my_charset_same(cinfo->default_table_charset,$4))
1625
my_error(ER_CONFLICTING_DECLARATIONS, MYF(0),
1626
"CHARACTER SET ", cinfo->default_table_charset->csname,
1627
"CHARACTER SET ", $4->csname);
1630
Lex->create_info.default_table_charset= $4;
1631
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
1329
1635
default_collation:
1330
1636
opt_default COLLATE_SYM opt_equal collation_name_or_default
1332
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1334
HA_CREATE_INFO *cinfo= &statement->create_info;
1638
HA_CREATE_INFO *cinfo= &Lex->create_info;
1335
1639
if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) &&
1336
1640
cinfo->default_table_charset && $4 &&
1337
1641
!my_charset_same(cinfo->default_table_charset,$4))
1339
1643
my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
1340
1644
$4->name, cinfo->default_table_charset->csname);
1343
statement->create_info.default_table_charset= $4;
1344
statement->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
1348
default_collation_schema:
1349
opt_default COLLATE_SYM opt_equal collation_name_or_default
1351
statement::CreateSchema *statement= (statement::CreateSchema *)Lex->statement;
1353
message::Schema &schema_message= statement->schema_message;
1354
schema_message.set_collation($4->name);
1647
Lex->create_info.default_table_charset= $4;
1648
Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
1655
plugin_ref plugin= ha_resolve_by_name(YYTHD, &$1);
1658
$$= plugin_data(plugin, handlerton*);
1661
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str);
1667
known_storage_engines:
1671
if ((plugin= ha_resolve_by_name(YYTHD, &$1)))
1672
$$= plugin_data(plugin, handlerton*);
1675
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str);
1459
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1460
1787
lex->length=lex->dec=0;
1462
statement->default_value= statement->on_update_value= 0;
1463
statement->comment= null_lex_str;
1789
lex->default_value= lex->on_update_value= 0;
1790
lex->comment=null_lex_str;
1464
1791
lex->charset=NULL;
1465
statement->column_format= COLUMN_FORMAT_TYPE_DEFAULT;
1467
message::AlterTable &alter_proto=
1468
((statement::CreateTable *)Lex->statement)->alter_info.alter_proto;
1469
statement->current_proto_field= alter_proto.add_added_field();
1792
lex->column_format= COLUMN_FORMAT_TYPE_DEFAULT;
1474
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1476
if (statement->current_proto_field)
1477
statement->current_proto_field->set_name($1.str);
1479
if (add_field_to_list(lex->session, &$1, (enum enum_field_types) $3,
1797
if (add_field_to_list(lex->thd, &$1, (enum enum_field_types) $3,
1480
1798
lex->length,lex->dec,lex->type,
1481
statement->column_format,
1482
statement->default_value, statement->on_update_value,
1483
&statement->comment,
1484
statement->change, &lex->interval_list, lex->charset))
1487
statement->current_proto_field= NULL;
1800
lex->default_value, lex->on_update_value,
1802
lex->change,&lex->interval_list,lex->charset))
1491
type opt_attribute {}
1498
Lex->length=(char*) 0; /* use default length */
1499
statement::CreateTable *statement=
1500
(statement::CreateTable *)Lex->statement;
1502
if (statement->current_proto_field)
1504
if ($1 == DRIZZLE_TYPE_LONG)
1505
statement->current_proto_field->set_type(message::Table::Field::INTEGER);
1506
else if ($1 == DRIZZLE_TYPE_LONGLONG)
1507
statement->current_proto_field->set_type(message::Table::Field::BIGINT);
1512
| real_type opt_precision
1516
statement::CreateTable *statement=
1517
(statement::CreateTable *)Lex->statement;
1519
if (statement->current_proto_field)
1521
assert ($1 == DRIZZLE_TYPE_DOUBLE);
1522
statement->current_proto_field->set_type(message::Table::Field::DOUBLE);
1528
$$=DRIZZLE_TYPE_VARCHAR;
1530
statement::CreateTable *statement=
1531
(statement::CreateTable *)Lex->statement;
1533
if (statement->current_proto_field)
1535
statement->current_proto_field->set_type(message::Table::Field::VARCHAR);
1536
message::Table::Field::StringFieldOptions *string_field_options;
1538
string_field_options= statement->current_proto_field->mutable_string_options();
1540
string_field_options->set_length(atoi($3.str));
1545
Lex->length=(char*) "1";
1546
$$=DRIZZLE_TYPE_VARCHAR;
1548
statement::CreateTable *statement=
1549
(statement::CreateTable *)Lex->statement;
1551
if (statement->current_proto_field)
1552
statement->current_proto_field->set_type(message::Table::Field::VARCHAR);
1554
| varchar '(' NUM ')'
1557
$$= DRIZZLE_TYPE_VARCHAR;
1559
statement::CreateTable *statement=
1560
(statement::CreateTable *)Lex->statement;
1562
if (statement->current_proto_field)
1564
statement->current_proto_field->set_type(message::Table::Field::VARCHAR);
1566
message::Table::Field::StringFieldOptions *string_field_options;
1568
string_field_options= statement->current_proto_field->mutable_string_options();
1570
string_field_options->set_length(atoi($3.str));
1573
| VARBINARY '(' NUM ')'
1576
Lex->charset=&my_charset_bin;
1577
$$= DRIZZLE_TYPE_VARCHAR;
1579
statement::CreateTable *statement=
1580
(statement::CreateTable *)Lex->statement;
1582
if (statement->current_proto_field)
1584
statement->current_proto_field->set_type(message::Table::Field::VARCHAR);
1585
message::Table::Field::StringFieldOptions *string_field_options;
1587
string_field_options= statement->current_proto_field->mutable_string_options();
1589
string_field_options->set_length(atoi($3.str));
1590
string_field_options->set_collation_id(my_charset_bin.number);
1591
string_field_options->set_collation(my_charset_bin.name);
1596
$$=DRIZZLE_TYPE_DATE;
1598
statement::CreateTable *statement=
1599
(statement::CreateTable *)Lex->statement;
1601
if (statement->current_proto_field)
1602
statement->current_proto_field->set_type(message::Table::Field::DATE);
1606
$$=DRIZZLE_TYPE_TIMESTAMP;
1608
statement::CreateTable *statement=
1609
(statement::CreateTable *)Lex->statement;
1611
if (statement->current_proto_field)
1612
statement->current_proto_field->set_type(message::Table::Field::TIMESTAMP);
1616
$$=DRIZZLE_TYPE_DATETIME;
1618
statement::CreateTable *statement=
1619
(statement::CreateTable *)Lex->statement;
1621
if (statement->current_proto_field)
1622
statement->current_proto_field->set_type(message::Table::Field::DATETIME);
1626
Lex->charset=&my_charset_bin;
1627
$$=DRIZZLE_TYPE_BLOB;
1628
Lex->length=(char*) 0; /* use default length */
1630
statement::CreateTable *statement=
1631
(statement::CreateTable *)Lex->statement;
1633
if (statement->current_proto_field)
1635
statement->current_proto_field->set_type(message::Table::Field::BLOB);
1636
message::Table::Field::StringFieldOptions *string_field_options;
1638
string_field_options= statement->current_proto_field->mutable_string_options();
1639
string_field_options->set_collation_id(my_charset_bin.number);
1640
string_field_options->set_collation(my_charset_bin.name);
1645
$$=DRIZZLE_TYPE_BLOB;
1646
Lex->length=(char*) 0; /* use default length */
1648
statement::CreateTable *statement=
1649
(statement::CreateTable *)Lex->statement;
1651
if (statement->current_proto_field)
1652
statement->current_proto_field->set_type(message::Table::Field::BLOB);
1654
| DECIMAL_SYM float_options
1656
$$=DRIZZLE_TYPE_DECIMAL;
1658
statement::CreateTable *statement=
1659
(statement::CreateTable *)Lex->statement;
1661
if (statement->current_proto_field)
1662
statement->current_proto_field->set_type(message::Table::Field::DECIMAL);
1664
| NUMERIC_SYM float_options
1666
$$=DRIZZLE_TYPE_DECIMAL;
1668
statement::CreateTable *statement=
1669
(statement::CreateTable *)Lex->statement;
1671
if (statement->current_proto_field)
1672
statement->current_proto_field->set_type(message::Table::Field::DECIMAL);
1674
| FIXED_SYM float_options
1676
$$=DRIZZLE_TYPE_DECIMAL;
1678
statement::CreateTable *statement=
1679
(statement::CreateTable *)Lex->statement;
1681
if (statement->current_proto_field)
1682
statement->current_proto_field->set_type(message::Table::Field::DECIMAL);
1685
{Lex->interval_list.empty();}
1688
$$=DRIZZLE_TYPE_ENUM;
1690
statement::CreateTable *statement=
1691
(statement::CreateTable *)Lex->statement;
1693
if (statement->current_proto_field)
1694
statement->current_proto_field->set_type(message::Table::Field::ENUM);
1698
$$=DRIZZLE_TYPE_UUID;
1700
statement::CreateTable *statement=
1701
(statement::CreateTable *)Lex->statement;
1703
if (statement->current_proto_field)
1704
statement->current_proto_field->set_type(message::Table::Field::UUID);
1808
int_type opt_len field_options { $$=$1; }
1809
| real_type opt_precision field_options { $$=$1; }
1812
Lex->length= (char*) "1";
1817
Lex->length=(char*) "1";
1822
Lex->length=(char*) "1";
1825
| char '(' NUM ')' opt_binary
1828
$$=MYSQL_TYPE_STRING;
1832
Lex->length=(char*) "1";
1833
$$=MYSQL_TYPE_STRING;
1835
| nchar '(' NUM ')' opt_bin_mod
1838
$$=MYSQL_TYPE_STRING;
1839
Lex->charset=national_charset_info;
1843
Lex->length=(char*) "1";
1844
$$=MYSQL_TYPE_STRING;
1845
Lex->charset=national_charset_info;
1847
| BINARY '(' NUM ')'
1850
Lex->charset=&my_charset_bin;
1851
$$=MYSQL_TYPE_STRING;
1855
Lex->length= (char*) "1";
1856
Lex->charset=&my_charset_bin;
1857
$$=MYSQL_TYPE_STRING;
1859
| varchar '(' NUM ')' opt_binary
1862
$$= MYSQL_TYPE_VARCHAR;
1864
| nvarchar '(' NUM ')' opt_bin_mod
1867
$$= MYSQL_TYPE_VARCHAR;
1868
Lex->charset=national_charset_info;
1870
| VARBINARY '(' NUM ')'
1873
Lex->charset=&my_charset_bin;
1874
$$= MYSQL_TYPE_VARCHAR;
1876
| YEAR_SYM opt_len field_options
1877
{ $$=MYSQL_TYPE_YEAR; }
1879
{ $$=MYSQL_TYPE_NEWDATE; }
1881
{ $$=MYSQL_TYPE_TIME; }
1884
/* Unlike other types TIMESTAMP fields are NOT NULL by default */
1885
Lex->type|= NOT_NULL_FLAG;
1886
$$=MYSQL_TYPE_TIMESTAMP;
1889
{ $$=MYSQL_TYPE_DATETIME; }
1892
Lex->charset=&my_charset_bin;
1895
| TEXT_SYM opt_len opt_binary
1896
{ $$=MYSQL_TYPE_BLOB; }
1897
| DECIMAL_SYM float_options field_options
1898
{ $$=MYSQL_TYPE_NEWDECIMAL;}
1899
| NUMERIC_SYM float_options field_options
1900
{ $$=MYSQL_TYPE_NEWDECIMAL;}
1901
| FIXED_SYM float_options field_options
1902
{ $$=MYSQL_TYPE_NEWDECIMAL;}
1904
{Lex->interval_list.empty();}
1905
'(' string_list ')' opt_binary
1906
{ $$=MYSQL_TYPE_ENUM; }
1908
{ Lex->interval_list.empty();}
1909
'(' string_list ')' opt_binary
1910
{ $$=MYSQL_TYPE_SET; }
1708
$$=DRIZZLE_TYPE_LONGLONG;
1709
Lex->type|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_FLAG);
1711
statement::CreateTable *statement= (statement::CreateTable *)Lex->statement;
1712
if (statement->current_proto_field)
1714
message::Table::Field::FieldConstraints *constraints;
1715
constraints= statement->current_proto_field->mutable_constraints();
1716
constraints->set_is_nullable(false);
1718
statement->current_proto_field->set_type(message::Table::Field::BIGINT);
1913
$$=MYSQL_TYPE_LONGLONG;
1914
Lex->type|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG |
1789
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1790
Lex->type&= ~ NOT_NULL_FLAG;
1792
if (statement->current_proto_field)
1794
message::Table::Field::FieldConstraints *constraints;
1795
constraints= statement->current_proto_field->mutable_constraints();
1796
constraints->set_is_nullable(true);
2014
NULL_SYM { Lex->type&= ~ NOT_NULL_FLAG; }
1799
2015
| COLUMN_FORMAT_SYM column_format_types
1801
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1803
statement->column_format= $2;
1804
statement->alter_info.flags.set(ALTER_COLUMN_FORMAT);
1808
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1809
Lex->type|= NOT_NULL_FLAG;
1811
if (statement->current_proto_field)
1813
message::Table::Field::FieldConstraints *constraints;
1814
constraints= statement->current_proto_field->mutable_constraints();
1815
constraints->set_is_nullable(false);
1818
| DEFAULT now_or_signed_literal
1820
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1822
statement->default_value=$2;
1823
statement->alter_info.flags.set(ALTER_COLUMN_DEFAULT);
1825
| ON UPDATE_SYM NOW_SYM optional_braces
1826
{ ((statement::AlterTable *)Lex->statement)->on_update_value= new Item_func_now_local(); }
1829
Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG;
1831
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1832
if (statement->current_proto_field)
1834
message::Table::Field::FieldConstraints *constraints;
1836
constraints= statement->current_proto_field->mutable_constraints();
1837
constraints->set_is_nullable(false);
2017
Lex->column_format= $2;
2018
Lex->alter_info.flags|= ALTER_COLUMN_FORMAT;
2020
| not NULL_SYM { Lex->type|= NOT_NULL_FLAG; }
2021
| DEFAULT now_or_signed_literal
2023
Lex->default_value=$2;
2024
Lex->alter_info.flags|= ALTER_COLUMN_DEFAULT;
2026
| ON UPDATE_SYM NOW_SYM optional_braces
2027
{ Lex->on_update_value= new Item_func_now_local(); }
2028
| AUTO_INC { Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; }
1840
2029
| SERIAL_SYM DEFAULT VALUE_SYM
1843
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1845
2032
lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_FLAG;
1846
statement->alter_info.flags.set(ALTER_ADD_INDEX);
1848
if (statement->current_proto_field)
1850
message::Table::Field::FieldConstraints *constraints;
1851
constraints= statement->current_proto_field->mutable_constraints();
1852
constraints->set_is_nullable(false);
2033
lex->alter_info.flags|= ALTER_ADD_INDEX;
1855
2035
| opt_primary KEY_SYM
1858
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1860
2038
lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG;
1861
statement->alter_info.flags.set(ALTER_ADD_INDEX);
1863
if (statement->current_proto_field)
1865
message::Table::Field::FieldConstraints *constraints;
1866
constraints= statement->current_proto_field->mutable_constraints();
1867
constraints->set_is_nullable(false);
2039
lex->alter_info.flags|= ALTER_ADD_INDEX;
1873
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1875
lex->type|= UNIQUE_FLAG;
1876
statement->alter_info.flags.set(ALTER_ADD_INDEX);
2044
lex->type|= UNIQUE_FLAG;
2045
lex->alter_info.flags|= ALTER_ADD_INDEX;
1878
2047
| UNIQUE_SYM KEY_SYM
1881
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1883
lex->type|= UNIQUE_KEY_FLAG;
1884
statement->alter_info.flags.set(ALTER_ADD_INDEX);
1886
| COMMENT_SYM TEXT_STRING_sys
1888
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
1889
statement->comment= $2;
1891
if (statement->current_proto_field)
1892
statement->current_proto_field->set_comment($2.str);
2050
lex->type|= UNIQUE_KEY_FLAG;
2051
lex->alter_info.flags|= ALTER_ADD_INDEX;
2053
| COMMENT_SYM TEXT_STRING_sys { Lex->comment= $2; }
1894
2054
| COLLATE_SYM collation_name
1896
2056
if (Lex->charset && !my_charset_same(Lex->charset,$2))
1898
2058
my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
1899
2059
$2->name,Lex->charset->csname);
2222
2541
add_column column_def opt_place { }
2225
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2227
statement->alter_info.flags.set(ALTER_ADD_INDEX);
2544
Lex->alter_info.flags|= ALTER_ADD_INDEX;
2229
2546
| add_column '(' field_list ')'
2231
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2233
statement->alter_info.flags.set(ALTER_ADD_COLUMN);
2234
statement->alter_info.flags.set(ALTER_ADD_INDEX);
2548
Lex->alter_info.flags|= ALTER_ADD_COLUMN | ALTER_ADD_INDEX;
2236
2550
| CHANGE opt_column field_ident
2238
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2239
statement->change= $3.str;
2240
statement->alter_info.flags.set(ALTER_CHANGE_COLUMN);
2553
lex->change= $3.str;
2554
lex->alter_info.flags|= ALTER_CHANGE_COLUMN;
2242
2556
field_spec opt_place
2243
2557
| MODIFY_SYM opt_column field_ident
2246
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2247
2560
lex->length=lex->dec=0; lex->type=0;
2248
statement->default_value= statement->on_update_value= 0;
2249
statement->comment= null_lex_str;
2561
lex->default_value= lex->on_update_value= 0;
2562
lex->comment=null_lex_str;
2250
2563
lex->charset= NULL;
2251
statement->alter_info.flags.set(ALTER_CHANGE_COLUMN);
2252
statement->column_format= COLUMN_FORMAT_TYPE_DEFAULT;
2254
statement->current_proto_field= NULL;
2564
lex->alter_info.flags|= ALTER_CHANGE_COLUMN;
2565
lex->column_format= COLUMN_FORMAT_TYPE_DEFAULT;
2259
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2261
if (add_field_to_list(lex->session,&$3,
2570
if (add_field_to_list(lex->thd,&$3,
2262
2571
(enum enum_field_types) $5,
2263
lex->length, lex->dec, lex->type,
2264
statement->column_format,
2265
statement->default_value,
2266
statement->on_update_value,
2267
&statement->comment,
2572
lex->length,lex->dec,lex->type,
2574
lex->default_value, lex->on_update_value,
2268
2576
$3.str, &lex->interval_list, lex->charset))
2272
2580
| DROP opt_column field_ident
2274
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2276
statement->alter_info.drop_list.push_back(new AlterDrop(AlterDrop::COLUMN, $3.str));
2277
statement->alter_info.flags.set(ALTER_DROP_COLUMN);
2583
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::COLUMN,
2585
lex->alter_info.flags|= ALTER_DROP_COLUMN;
2279
2587
| DROP FOREIGN KEY_SYM opt_ident
2281
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2282
statement->alter_info.drop_list.push_back(new AlterDrop(AlterDrop::FOREIGN_KEY,
2284
statement->alter_info.flags.set(ALTER_DROP_INDEX);
2285
statement->alter_info.flags.set(ALTER_FOREIGN_KEY);
2589
Lex->alter_info.flags|= ALTER_DROP_INDEX | ALTER_FOREIGN_KEY;
2287
2591
| DROP PRIMARY_SYM KEY_SYM
2289
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2291
statement->alter_info.drop_list.push_back(new AlterDrop(AlterDrop::KEY,
2293
statement->alter_info.flags.set(ALTER_DROP_INDEX);
2594
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY,
2596
lex->alter_info.flags|= ALTER_DROP_INDEX;
2295
2598
| DROP key_or_index field_ident
2297
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2299
statement->alter_info.drop_list.push_back(new AlterDrop(AlterDrop::KEY,
2301
statement->alter_info.flags.set(ALTER_DROP_INDEX);
2601
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY,
2603
lex->alter_info.flags|= ALTER_DROP_INDEX;
2303
2605
| DISABLE_SYM KEYS
2305
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2307
statement->alter_info.keys_onoff= DISABLE;
2308
statement->alter_info.flags.set(ALTER_KEYS_ONOFF);
2608
lex->alter_info.keys_onoff= DISABLE;
2609
lex->alter_info.flags|= ALTER_KEYS_ONOFF;
2310
2611
| ENABLE_SYM KEYS
2312
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2314
statement->alter_info.keys_onoff= ENABLE;
2315
statement->alter_info.flags.set(ALTER_KEYS_ONOFF);
2614
lex->alter_info.keys_onoff= ENABLE;
2615
lex->alter_info.flags|= ALTER_KEYS_ONOFF;
2317
2617
| ALTER opt_column field_ident SET DEFAULT signed_literal
2319
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2321
statement->alter_info.alter_list.push_back(new AlterColumn($3.str,$6));
2322
statement->alter_info.flags.set(ALTER_COLUMN_DEFAULT);
2620
lex->alter_info.alter_list.push_back(new Alter_column($3.str,$6));
2621
lex->alter_info.flags|= ALTER_COLUMN_DEFAULT;
2324
2623
| ALTER opt_column field_ident DROP DEFAULT
2326
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2328
statement->alter_info.alter_list.push_back(new AlterColumn($3.str, (Item*) 0));
2329
statement->alter_info.flags.set(ALTER_COLUMN_DEFAULT);
2626
lex->alter_info.alter_list.push_back(new Alter_column($3.str,
2628
lex->alter_info.flags|= ALTER_COLUMN_DEFAULT;
2331
2630
| RENAME opt_to table_ident
2334
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2337
2634
lex->select_lex.db=$3->db.str;
2338
2635
if (lex->select_lex.db == NULL &&
2339
2636
lex->copy_db_to(&lex->select_lex.db, &dummy))
2344
if (check_table_name($3->table.str,$3->table.length))
2640
if (check_table_name($3->table.str,$3->table.length) || ($3->db.str && check_db_name(&$3->db)))
2346
2642
my_error(ER_WRONG_TABLE_NAME, MYF(0), $3->table.str);
2350
2645
lex->name= $3->table;
2351
statement->alter_info.flags.set(ALTER_RENAME);
2646
lex->alter_info.flags|= ALTER_RENAME;
2353
| CONVERT_SYM TO_SYM collation_name_or_default
2648
| CONVERT_SYM TO_SYM charset charset_name_or_default opt_collate
2355
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2357
statement->create_info.table_charset=
2358
statement->create_info.default_table_charset= $3;
2359
statement->create_info.used_fields|= (HA_CREATE_USED_CHARSET |
2653
$4= thd->variables.collation_database;
2656
if (!my_charset_same($4,$5))
2658
my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
2659
$5->name, $4->csname);
2663
lex->create_info.table_charset=
2664
lex->create_info.default_table_charset= $5;
2665
lex->create_info.used_fields|= (HA_CREATE_USED_CHARSET |
2360
2666
HA_CREATE_USED_DEFAULT_CHARSET);
2361
statement->alter_info.flags.set(ALTER_CONVERT);
2667
lex->alter_info.flags|= ALTER_CONVERT;
2363
2669
| create_table_options_space_separated
2365
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2367
statement->alter_info.flags.set(ALTER_OPTIONS);
2672
lex->alter_info.flags|= ALTER_OPTIONS;
2371
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2373
statement->alter_info.flags.set(ALTER_FORCE);
2676
Lex->alter_info.flags|= ALTER_FORCE;
2375
2678
| alter_order_clause
2377
statement::AlterTable *statement= (statement::AlterTable *)Lex->statement;
2379
statement->alter_info.flags.set(ALTER_ORDER);
2681
lex->alter_info.flags|= ALTER_ORDER;
2717
SLAVE START and SLAVE STOP are deprecated. We keep them for compatibility.
2721
START_SYM SLAVE slave_thread_opts
2724
lex->sql_command = SQLCOM_SLAVE_START;
2726
/* We'll use mi structure for UNTIL options */
2727
bzero((char*) &lex->mi, sizeof(lex->mi));
2728
/* If you change this code don't forget to update SLAVE START too */
2732
| STOP_SYM SLAVE slave_thread_opts
2735
lex->sql_command = SQLCOM_SLAVE_STOP;
2737
/* If you change this code don't forget to update SLAVE STOP too */
2739
| SLAVE START_SYM slave_thread_opts
2742
lex->sql_command = SQLCOM_SLAVE_START;
2744
/* We'll use mi structure for UNTIL options */
2745
bzero((char*) &lex->mi, sizeof(lex->mi));
2749
| SLAVE STOP_SYM slave_thread_opts
2752
lex->sql_command = SQLCOM_SLAVE_STOP;
2419
2758
START_SYM TRANSACTION_SYM start_transaction_opts
2422
2761
lex->sql_command= SQLCOM_BEGIN;
2423
lex->statement= new(std::nothrow) statement::StartTransaction(YYSession, (start_transaction_option_t)$3);
2424
if (lex->statement == NULL)
2762
lex->start_transaction_opt= $3;
2429
2766
start_transaction_opts:
2430
/*empty*/ { $$ = START_TRANS_NO_OPTIONS; }
2767
/*empty*/ { $$ = 0; }
2431
2768
| WITH CONSISTENT_SYM SNAPSHOT_SYM
2433
$$= START_TRANS_OPT_WITH_CONS_SNAPSHOT;
2770
$$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT;
2775
{ Lex->slave_thd_opt= 0; }
2776
slave_thread_opt_list
2780
slave_thread_opt_list:
2782
| slave_thread_opt_list ',' slave_thread_opt
2787
| SQL_THREAD { Lex->slave_thd_opt|=SLAVE_SQL; }
2788
| RELAY_THREAD { Lex->slave_thd_opt|=SLAVE_IO; }
2793
| UNTIL_SYM slave_until_opts
2796
if (((lex->mi.log_file_name || lex->mi.pos) && (lex->mi.relay_log_name || lex->mi.relay_log_pos)) ||
2797
!((lex->mi.log_file_name && lex->mi.pos) ||
2798
(lex->mi.relay_log_name && lex->mi.relay_log_pos)))
2800
my_message(ER_BAD_SLAVE_UNTIL_COND,
2801
ER(ER_BAD_SLAVE_UNTIL_COND), MYF(0));
2809
| slave_until_opts ',' master_file_def
2813
CHECKSUM_SYM table_or_tables
2816
lex->sql_command = SQLCOM_CHECKSUM;
2818
table_list opt_checksum_type
2823
/* nothing */ { Lex->check_opt.flags= 0; }
2824
| QUICK { Lex->check_opt.flags= T_QUICK; }
2825
| EXTENDED_SYM { Lex->check_opt.flags= T_EXTEND; }
2829
REPAIR opt_no_write_to_binlog table_or_tables
2832
lex->sql_command = SQLCOM_REPAIR;
2833
lex->no_write_to_binlog= $2;
2834
lex->check_opt.init();
2836
table_list opt_mi_repair_type
2841
/* empty */ { Lex->check_opt.flags = T_MEDIUM; }
2842
| mi_repair_types {}
2847
| mi_repair_type mi_repair_types {}
2851
QUICK { Lex->check_opt.flags|= T_QUICK; }
2852
| EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; }
2853
| USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; }
2438
ANALYZE_SYM table_or_tables
2857
ANALYZE_SYM opt_no_write_to_binlog table_or_tables
2441
2860
lex->sql_command = SQLCOM_ANALYZE;
2442
lex->statement= new(std::nothrow) statement::Analyze(YYSession);
2443
if (lex->statement == NULL)
2861
lex->no_write_to_binlog= $2;
2862
lex->check_opt.init();
2868
binlog_base64_event:
2869
BINLOG_SYM TEXT_STRING_sys
2871
Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT;
2451
2877
CHECK_SYM table_or_tables
2455
2881
lex->sql_command = SQLCOM_CHECK;
2456
lex->statement= new(std::nothrow) statement::Check(YYSession);
2457
if (lex->statement == NULL)
2882
lex->check_opt.init();
2884
table_list opt_mi_check_type
2889
/* empty */ { Lex->check_opt.flags = T_MEDIUM; }
2895
| mi_check_type mi_check_types {}
2899
QUICK { Lex->check_opt.flags|= T_QUICK; }
2900
| FAST_SYM { Lex->check_opt.flags|= T_FAST; }
2901
| MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; }
2902
| EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; }
2903
| CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; }
2904
| FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; }
2908
OPTIMIZE opt_no_write_to_binlog table_or_tables
2911
lex->sql_command = SQLCOM_OPTIMIZE;
2912
lex->no_write_to_binlog= $2;
2913
lex->check_opt.init();
2919
opt_no_write_to_binlog:
2920
/* empty */ { $$= 0; }
2921
| NO_WRITE_TO_BINLOG { $$= 1; }
2922
| LOCAL_SYM { $$= 1; }
2465
2926
RENAME table_or_tables
2467
2928
Lex->sql_command= SQLCOM_RENAME_TABLE;
2468
Lex->statement= new(std::nothrow) statement::RenameTable(YYSession);
2469
if (Lex->statement == NULL)
2472
2930
table_to_table_list
2969
3456
| function_call_conflict
2970
3457
| simple_expr COLLATE_SYM ident_or_text %prec NEG
2972
Session *session= YYSession;
2973
Item *i1= new (session->mem_root) Item_string($3.str,
3460
Item *i1= new (thd->mem_root) Item_string($3.str,
2975
session->charset());
2976
$$= new (session->mem_root) Item_func_set_collation($1, i1);
3463
$$= new (thd->mem_root) Item_func_set_collation($1, i1);
2982
Lex->setSumExprUsed();
2984
3468
| '+' simple_expr %prec NEG { $$= $2; }
2985
3469
| '-' simple_expr %prec NEG
2986
{ $$= new (YYSession->mem_root) Item_func_neg($2); }
3470
{ $$= new (YYTHD->mem_root) Item_func_neg($2); }
3471
| '~' simple_expr %prec NEG
3472
{ $$= new (YYTHD->mem_root) Item_func_bit_neg($2); }
2987
3473
| '(' subselect ')'
2989
$$= new (YYSession->mem_root) Item_singlerow_subselect($2);
3475
$$= new (YYTHD->mem_root) Item_singlerow_subselect($2);
2991
3477
| '(' expr ')' { $$= $2; }
2992
3478
| '(' expr ',' expr_list ')'
2994
3480
$4->push_front($2);
2995
$$= new (YYSession->mem_root) Item_row(*$4);
3481
$$= new (YYTHD->mem_root) Item_row(*$4);
2997
3483
| ROW_SYM '(' expr ',' expr_list ')'
2999
3485
$5->push_front($3);
3000
$$= new (YYSession->mem_root) Item_row(*$5);
3486
$$= new (YYTHD->mem_root) Item_row(*$5);
3002
3488
| EXISTS '(' subselect ')'
3004
$$= new (YYSession->mem_root) Item_exists_subselect($3);
3490
$$= new (YYTHD->mem_root) Item_exists_subselect($3);
3006
3492
| '{' ident expr '}' { $$= $3; }
3007
3493
| BINARY simple_expr %prec NEG
3009
$$= create_func_cast(YYSession, $2, ITEM_CAST_CHAR, NULL, NULL,
3495
$$= create_func_cast(YYTHD, $2, ITEM_CAST_CHAR, NULL, NULL,
3010
3496
&my_charset_bin);
3012
3498
| CAST_SYM '(' expr AS cast_type ')'
3015
$$= create_func_cast(YYSession, $3, $5, lex->length, lex->dec,
3501
$$= create_func_cast(YYTHD, $3, $5, lex->length, lex->dec,
3020
3506
| CASE_SYM opt_expr when_list opt_else END
3021
{ $$= new (YYSession->mem_root) Item_func_case(* $3, $2, $4 ); }
3507
{ $$= new (YYTHD->mem_root) Item_func_case(* $3, $2, $4 ); }
3022
3508
| CONVERT_SYM '(' expr ',' cast_type ')'
3024
$$= create_func_cast(YYSession, $3, $5, Lex->length, Lex->dec,
3510
$$= create_func_cast(YYTHD, $3, $5, Lex->length, Lex->dec,
3515
| CONVERT_SYM '(' expr USING charset_name ')'
3516
{ $$= new (YYTHD->mem_root) Item_func_conv_charset($3,$5); }
3029
3517
| DEFAULT '(' simple_ident ')'
3031
$$= new (YYSession->mem_root) Item_default_value(Lex->current_context(),
3519
$$= new (YYTHD->mem_root) Item_default_value(Lex->current_context(),
3034
3522
| VALUES '(' simple_ident_nospvar ')'
3036
$$= new (YYSession->mem_root) Item_insert_value(Lex->current_context(),
3524
$$= new (YYTHD->mem_root) Item_insert_value(Lex->current_context(),
3039
3527
| INTERVAL_SYM expr interval '+' expr %prec INTERVAL_SYM
3040
3528
/* we cannot put interval before - */
3041
{ $$= new (YYSession->mem_root) Item_date_add_interval($5,$2,$3,0); }
3529
{ $$= new (YYTHD->mem_root) Item_date_add_interval($5,$2,$3,0); }
3050
3538
function_call_keyword:
3051
3539
CHAR_SYM '(' expr_list ')'
3052
{ $$= new (YYSession->mem_root) Item_func_char(*$3); }
3540
{ $$= new (YYTHD->mem_root) Item_func_char(*$3); }
3541
| CHAR_SYM '(' expr_list USING charset_name ')'
3542
{ $$= new (YYTHD->mem_root) Item_func_char(*$3, $5); }
3053
3543
| CURRENT_USER optional_braces
3055
std::string user_str("user");
3056
if (! ($$= reserved_keyword_function(YYSession, user_str, NULL)))
3060
Lex->setCacheable(false);
3545
$$= new (YYTHD->mem_root) Item_func_current_user(Lex->current_context());
3546
Lex->set_stmt_unsafe();
3062
3548
| DATE_SYM '(' expr ')'
3063
{ $$= new (YYSession->mem_root) Item_date_typecast($3); }
3549
{ $$= new (YYTHD->mem_root) Item_date_typecast($3); }
3064
3550
| DAY_SYM '(' expr ')'
3065
{ $$= new (YYSession->mem_root) Item_func_dayofmonth($3); }
3551
{ $$= new (YYTHD->mem_root) Item_func_dayofmonth($3); }
3066
3552
| HOUR_SYM '(' expr ')'
3067
{ $$= new (YYSession->mem_root) Item_func_hour($3); }
3553
{ $$= new (YYTHD->mem_root) Item_func_hour($3); }
3068
3554
| INSERT '(' expr ',' expr ',' expr ',' expr ')'
3069
{ $$= new (YYSession->mem_root) Item_func_insert(*YYSession, $3, $5, $7, $9); }
3555
{ $$= new (YYTHD->mem_root) Item_func_insert($3,$5,$7,$9); }
3070
3556
| INTERVAL_SYM '(' expr ',' expr ')' %prec INTERVAL_SYM
3072
Session *session= YYSession;
3073
List<Item> *list= new (session->mem_root) List<Item>;
3559
List<Item> *list= new (thd->mem_root) List<Item>;
3074
3560
list->push_front($5);
3075
3561
list->push_front($3);
3076
Item_row *item= new (session->mem_root) Item_row(*list);
3077
$$= new (session->mem_root) Item_func_interval(item);
3562
Item_row *item= new (thd->mem_root) Item_row(*list);
3563
$$= new (thd->mem_root) Item_func_interval(item);
3079
3565
| INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' %prec INTERVAL_SYM
3081
Session *session= YYSession;
3082
3568
$7->push_front($5);
3083
3569
$7->push_front($3);
3084
Item_row *item= new (session->mem_root) Item_row(*$7);
3085
$$= new (session->mem_root) Item_func_interval(item);
3570
Item_row *item= new (thd->mem_root) Item_row(*$7);
3571
$$= new (thd->mem_root) Item_func_interval(item);
3087
3573
| LEFT '(' expr ',' expr ')'
3088
{ $$= new (YYSession->mem_root) Item_func_left($3,$5); }
3574
{ $$= new (YYTHD->mem_root) Item_func_left($3,$5); }
3089
3575
| MINUTE_SYM '(' expr ')'
3090
{ $$= new (YYSession->mem_root) Item_func_minute($3); }
3576
{ $$= new (YYTHD->mem_root) Item_func_minute($3); }
3091
3577
| MONTH_SYM '(' expr ')'
3092
{ $$= new (YYSession->mem_root) Item_func_month($3); }
3578
{ $$= new (YYTHD->mem_root) Item_func_month($3); }
3093
3579
| RIGHT '(' expr ',' expr ')'
3094
{ $$= new (YYSession->mem_root) Item_func_right($3,$5); }
3580
{ $$= new (YYTHD->mem_root) Item_func_right($3,$5); }
3095
3581
| SECOND_SYM '(' expr ')'
3096
{ $$= new (YYSession->mem_root) Item_func_second($3); }
3097
| TIMESTAMP_SYM '(' expr ')'
3098
{ $$= new (YYSession->mem_root) Item_datetime_typecast($3); }
3582
{ $$= new (YYTHD->mem_root) Item_func_second($3); }
3583
| TIME_SYM '(' expr ')'
3584
{ $$= new (YYTHD->mem_root) Item_time_typecast($3); }
3585
| TIMESTAMP '(' expr ')'
3586
{ $$= new (YYTHD->mem_root) Item_datetime_typecast($3); }
3587
| TIMESTAMP '(' expr ',' expr ')'
3588
{ $$= new (YYTHD->mem_root) Item_func_add_time($3, $5, 1, 0); }
3099
3589
| TRIM '(' expr ')'
3100
{ $$= new (YYSession->mem_root) Item_func_trim($3); }
3590
{ $$= new (YYTHD->mem_root) Item_func_trim($3); }
3101
3591
| TRIM '(' LEADING expr FROM expr ')'
3102
{ $$= new (YYSession->mem_root) Item_func_ltrim($6,$4); }
3592
{ $$= new (YYTHD->mem_root) Item_func_ltrim($6,$4); }
3103
3593
| TRIM '(' TRAILING expr FROM expr ')'
3104
{ $$= new (YYSession->mem_root) Item_func_rtrim($6,$4); }
3594
{ $$= new (YYTHD->mem_root) Item_func_rtrim($6,$4); }
3105
3595
| TRIM '(' BOTH expr FROM expr ')'
3106
{ $$= new (YYSession->mem_root) Item_func_trim($6,$4); }
3596
{ $$= new (YYTHD->mem_root) Item_func_trim($6,$4); }
3107
3597
| TRIM '(' LEADING FROM expr ')'
3108
{ $$= new (YYSession->mem_root) Item_func_ltrim($5); }
3598
{ $$= new (YYTHD->mem_root) Item_func_ltrim($5); }
3109
3599
| TRIM '(' TRAILING FROM expr ')'
3110
{ $$= new (YYSession->mem_root) Item_func_rtrim($5); }
3600
{ $$= new (YYTHD->mem_root) Item_func_rtrim($5); }
3111
3601
| TRIM '(' BOTH FROM expr ')'
3112
{ $$= new (YYSession->mem_root) Item_func_trim($5); }
3602
{ $$= new (YYTHD->mem_root) Item_func_trim($5); }
3113
3603
| TRIM '(' expr FROM expr ')'
3114
{ $$= new (YYSession->mem_root) Item_func_trim($5,$3); }
3604
{ $$= new (YYTHD->mem_root) Item_func_trim($5,$3); }
3117
std::string user_str("user");
3118
if (! ($$= reserved_keyword_function(YYSession, user_str, NULL)))
3122
Lex->setCacheable(false);
3607
$$= new (YYTHD->mem_root) Item_func_user();
3608
Lex->set_stmt_unsafe();
3124
3610
| YEAR_SYM '(' expr ')'
3125
{ $$= new (YYSession->mem_root) Item_func_year($3); }
3611
{ $$= new (YYTHD->mem_root) Item_func_year($3); }
3134
3620
The only reasons a function should be added here are:
3135
3621
- for compatibility reasons with another SQL syntax (CURDATE),
3622
- for typing reasons (GET_FORMAT)
3136
3623
Any other 'Syntaxic sugar' enhancements should be *STRONGLY*
3139
3626
function_call_nonkeyword:
3140
3627
ADDDATE_SYM '(' expr ',' expr ')'
3142
$$= new (YYSession->mem_root) Item_date_add_interval($3, $5,
3629
$$= new (YYTHD->mem_root) Item_date_add_interval($3, $5,
3143
3630
INTERVAL_DAY, 0);
3145
3632
| ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')'
3146
{ $$= new (YYSession->mem_root) Item_date_add_interval($3, $6, $7, 0); }
3633
{ $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 0); }
3147
3634
| CURDATE optional_braces
3149
$$= new (YYSession->mem_root) Item_func_curdate_local();
3150
Lex->setCacheable(false);
3636
$$= new (YYTHD->mem_root) Item_func_curdate_local();
3638
| CURTIME optional_braces
3640
$$= new (YYTHD->mem_root) Item_func_curtime_local();
3642
| CURTIME '(' expr ')'
3644
$$= new (YYTHD->mem_root) Item_func_curtime_local($3);
3152
3646
| DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' %prec INTERVAL_SYM
3153
{ $$= new (YYSession->mem_root) Item_date_add_interval($3,$6,$7,0); }
3647
{ $$= new (YYTHD->mem_root) Item_date_add_interval($3,$6,$7,0); }
3154
3648
| DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' %prec INTERVAL_SYM
3155
{ $$= new (YYSession->mem_root) Item_date_add_interval($3,$6,$7,1); }
3649
{ $$= new (YYTHD->mem_root) Item_date_add_interval($3,$6,$7,1); }
3156
3650
| EXTRACT_SYM '(' interval FROM expr ')'
3157
{ $$=new (YYSession->mem_root) Item_extract( $3, $5); }
3651
{ $$=new (YYTHD->mem_root) Item_extract( $3, $5); }
3652
| GET_FORMAT '(' date_time_type ',' expr ')'
3653
{ $$= new (YYTHD->mem_root) Item_func_get_format($3, $5); }
3158
3654
| NOW_SYM optional_braces
3160
$$= new (YYSession->mem_root) Item_func_now_local();
3161
Lex->setCacheable(false);
3656
$$= new (YYTHD->mem_root) Item_func_now_local();
3163
3658
| NOW_SYM '(' expr ')'
3165
$$= new (YYSession->mem_root) Item_func_now_local($3);
3166
Lex->setCacheable(false);
3660
$$= new (YYTHD->mem_root) Item_func_now_local($3);
3168
3662
| POSITION_SYM '(' bit_expr IN_SYM expr ')'
3169
{ $$ = new (YYSession->mem_root) Item_func_locate($5,$3); }
3663
{ $$ = new (YYTHD->mem_root) Item_func_locate($5,$3); }
3170
3664
| SUBDATE_SYM '(' expr ',' expr ')'
3172
$$= new (YYSession->mem_root) Item_date_add_interval($3, $5,
3666
$$= new (YYTHD->mem_root) Item_date_add_interval($3, $5,
3173
3667
INTERVAL_DAY, 1);
3175
3669
| SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')'
3176
{ $$= new (YYSession->mem_root) Item_date_add_interval($3, $6, $7, 1); }
3670
{ $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 1); }
3177
3671
| SUBSTRING '(' expr ',' expr ',' expr ')'
3179
std::string reverse_str("substr");
3180
List<Item> *args= new (YYSession->mem_root) List<Item>;
3181
args->push_back($3);
3182
args->push_back($5);
3183
args->push_back($7);
3184
if (! ($$= reserved_keyword_function(YYSession, reverse_str, args)))
3672
{ $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); }
3189
3673
| SUBSTRING '(' expr ',' expr ')'
3191
std::string reverse_str("substr");
3192
List<Item> *args= new (YYSession->mem_root) List<Item>;
3193
args->push_back($3);
3194
args->push_back($5);
3195
if (! ($$= reserved_keyword_function(YYSession, reverse_str, args)))
3674
{ $$= new (YYTHD->mem_root) Item_func_substr($3,$5); }
3200
3675
| SUBSTRING '(' expr FROM expr FOR_SYM expr ')'
3202
std::string reverse_str("substr");
3203
List<Item> *args= new (YYSession->mem_root) List<Item>;
3204
args->push_back($3);
3205
args->push_back($5);
3206
args->push_back($7);
3207
if (! ($$= reserved_keyword_function(YYSession, reverse_str, args)))
3676
{ $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7); }
3212
3677
| SUBSTRING '(' expr FROM expr ')'
3214
std::string reverse_str("substr");
3215
List<Item> *args= new (YYSession->mem_root) List<Item>;
3216
args->push_back($3);
3217
args->push_back($5);
3218
if (! ($$= reserved_keyword_function(YYSession, reverse_str, args)))
3678
{ $$= new (YYTHD->mem_root) Item_func_substr($3,$5); }
3223
3679
| SYSDATE optional_braces
3225
$$= new (YYSession->mem_root) Item_func_sysdate_local();
3226
Lex->setCacheable(false);
3681
if (global_system_variables.sysdate_is_now == 0)
3682
$$= new (YYTHD->mem_root) Item_func_sysdate_local();
3684
$$= new (YYTHD->mem_root) Item_func_now_local();
3228
3686
| SYSDATE '(' expr ')'
3230
$$= new (YYSession->mem_root) Item_func_sysdate_local($3);
3231
Lex->setCacheable(false);
3688
if (global_system_variables.sysdate_is_now == 0)
3689
$$= new (YYTHD->mem_root) Item_func_sysdate_local($3);
3691
$$= new (YYTHD->mem_root) Item_func_now_local($3);
3233
3693
| TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')'
3234
{ $$= new (YYSession->mem_root) Item_date_add_interval($7,$5,$3,0); }
3694
{ $$= new (YYTHD->mem_root) Item_date_add_interval($7,$5,$3,0); }
3235
3695
| TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')'
3236
{ $$= new (YYSession->mem_root) Item_func_timestamp_diff($5,$7,$3); }
3696
{ $$= new (YYTHD->mem_root) Item_func_timestamp_diff($5,$7,$3); }
3237
3697
| UTC_DATE_SYM optional_braces
3239
$$= new (YYSession->mem_root) Item_func_curdate_utc();
3240
Lex->setCacheable(false);
3699
$$= new (YYTHD->mem_root) Item_func_curdate_utc();
3701
| UTC_TIME_SYM optional_braces
3703
$$= new (YYTHD->mem_root) Item_func_curtime_utc();
3242
3705
| UTC_TIMESTAMP_SYM optional_braces
3244
$$= new (YYSession->mem_root) Item_func_now_utc();
3245
Lex->setCacheable(false);
3707
$$= new (YYTHD->mem_root) Item_func_now_utc();
3252
3714
a dedicated rule is needed here.
3254
3716
function_call_conflict:
3255
COALESCE '(' expr_list ')'
3256
{ $$= new (YYSession->mem_root) Item_func_coalesce(* $3); }
3717
ASCII_SYM '(' expr ')'
3718
{ $$= new (YYTHD->mem_root) Item_func_ascii($3); }
3719
| CHARSET '(' expr ')'
3720
{ $$= new (YYTHD->mem_root) Item_func_charset($3); }
3721
| COALESCE '(' expr_list ')'
3722
{ $$= new (YYTHD->mem_root) Item_func_coalesce(* $3); }
3257
3723
| COLLATION_SYM '(' expr ')'
3258
{ $$= new (YYSession->mem_root) Item_func_collation($3); }
3724
{ $$= new (YYTHD->mem_root) Item_func_collation($3); }
3259
3725
| DATABASE '(' ')'
3261
std::string database_str("database");
3262
if (! ($$= reserved_keyword_function(YYSession, database_str, NULL)))
3266
Lex->setCacheable(false);
3268
| EXECUTE_SYM '(' expr ')' opt_wait
3270
List<Item> *args= new (YYSession->mem_root) List<Item>;
3271
args->push_back($3);
3275
args->push_back(new (YYSession->mem_root) Item_int(1));
3278
if (! ($$= reserved_keyword_function(YYSession, "execute", args)))
3727
$$= new (YYTHD->mem_root) Item_func_database();
3283
3729
| IF '(' expr ',' expr ',' expr ')'
3284
{ $$= new (YYSession->mem_root) Item_func_if($3,$5,$7); }
3285
| KILL_SYM kill_option '(' expr ')'
3287
std::string kill_str("kill");
3288
List<Item> *args= new (YYSession->mem_root) List<Item>;
3289
args->push_back($4);
3293
args->push_back(new (YYSession->mem_root) Item_uint(1));
3296
if (! ($$= reserved_keyword_function(YYSession, kill_str, args)))
3730
{ $$= new (YYTHD->mem_root) Item_func_if($3,$5,$7); }
3301
3731
| MICROSECOND_SYM '(' expr ')'
3302
{ $$= new (YYSession->mem_root) Item_func_microsecond($3); }
3732
{ $$= new (YYTHD->mem_root) Item_func_microsecond($3); }
3303
3733
| MOD_SYM '(' expr ',' expr ')'
3304
{ $$ = new (YYSession->mem_root) Item_func_mod( $3, $5); }
3734
{ $$ = new (YYTHD->mem_root) Item_func_mod( $3, $5); }
3735
| PASSWORD '(' expr ')'
3739
i1= new (thd->mem_root) Item_func_password($3);
3305
3742
| QUARTER_SYM '(' expr ')'
3306
{ $$ = new (YYSession->mem_root) Item_func_quarter($3); }
3743
{ $$ = new (YYTHD->mem_root) Item_func_quarter($3); }
3307
3744
| REPEAT_SYM '(' expr ',' expr ')'
3308
{ $$= new (YYSession->mem_root) Item_func_repeat(*YYSession, $3, $5); }
3745
{ $$= new (YYTHD->mem_root) Item_func_repeat($3,$5); }
3309
3746
| REPLACE '(' expr ',' expr ',' expr ')'
3310
{ $$= new (YYSession->mem_root) Item_func_replace(*YYSession, $3, $5, $7); }
3747
{ $$= new (YYTHD->mem_root) Item_func_replace($3,$5,$7); }
3311
3748
| REVERSE_SYM '(' expr ')'
3313
std::string reverse_str("reverse");
3314
List<Item> *args= new (YYSession->mem_root) List<Item>;
3315
args->push_back($3);
3316
if (! ($$= reserved_keyword_function(YYSession, reverse_str, args)))
3749
{ $$= new (YYTHD->mem_root) Item_func_reverse($3); }
3321
3750
| TRUNCATE_SYM '(' expr ',' expr ')'
3322
{ $$= new (YYSession->mem_root) Item_func_round($3,$5,1); }
3323
| WAIT_SYM '(' expr ')'
3325
std::string wait_str("wait");
3326
List<Item> *args= new (YYSession->mem_root) List<Item>;
3327
args->push_back($3);
3328
if (! ($$= reserved_keyword_function(YYSession, wait_str, args)))
3335
if (! ($$= reserved_keyword_function(YYSession, "uuid", NULL)))
3339
Lex->setCacheable(false);
3341
| WAIT_SYM '(' expr ',' expr ')'
3343
std::string wait_str("wait");
3344
List<Item> *args= new (YYSession->mem_root) List<Item>;
3345
args->push_back($3);
3346
args->push_back($5);
3347
if (! ($$= reserved_keyword_function(YYSession, wait_str, args)))
3751
{ $$= new (YYTHD->mem_root) Item_func_round($3,$5,1); }
3752
| WEEK_SYM '(' expr ')'
3755
Item *i1= new (thd->mem_root) Item_int((char*) "0",
3756
thd->variables.default_week_format,
3759
$$= new (thd->mem_root) Item_func_week($3, i1);
3761
| WEEK_SYM '(' expr ',' expr ')'
3762
{ $$= new (YYTHD->mem_root) Item_func_week($3,$5); }
3763
| WEIGHT_STRING_SYM '(' expr opt_ws_levels ')'
3764
{ $$= new (YYTHD->mem_root) Item_func_weight_string($3, 0, $4); }
3765
| WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')'
3767
$$= new (YYTHD->mem_root)
3768
Item_func_weight_string($3, $6, $7|MY_STRXFRM_PAD_WITH_SPACE);
3770
| WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')'
3772
$3= create_func_char_cast(YYTHD, $3, $6, &my_charset_bin);
3773
$$= new (YYTHD->mem_root)
3774
Item_func_weight_string($3, $6, MY_STRXFRM_PAD_WITH_SPACE);
3777
4229
| table_ref RIGHT opt_outer JOIN_SYM table_ref
3780
DRIZZLE_YYABORT_UNLESS($1 && $5);
4232
MYSQL_YYABORT_UNLESS($1 && $5);
3781
4233
/* Change the current name resolution context to a local context. */
3782
if (push_new_name_resolution_context(YYSession, $1, $5))
3784
Lex->current_select->parsing_place= IN_ON;
4234
if (push_new_name_resolution_context(YYTHD, $1, $5))
4236
Select->parsing_place= IN_ON;
3789
4241
if (!($$= lex->current_select->convert_right_join()))
3791
4243
add_join_on($$, $8);
3792
4244
Lex->pop_context();
3793
Lex->current_select->parsing_place= NO_MATTER;
4245
Select->parsing_place= NO_MATTER;
3795
4247
| table_ref RIGHT opt_outer JOIN_SYM table_factor
3797
DRIZZLE_YYABORT_UNLESS($1 && $5);
4249
MYSQL_YYABORT_UNLESS($1 && $5);
3799
4251
USING '(' using_list ')'
3802
4254
if (!($$= lex->current_select->convert_right_join()))
3804
add_join_natural($$,$5,$9,Lex->current_select);
4256
add_join_natural($$,$5,$9,Select);
3806
4258
| table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor
3808
DRIZZLE_YYABORT_UNLESS($1 && $6);
3809
add_join_natural($6,$1,NULL,Lex->current_select);
4260
MYSQL_YYABORT_UNLESS($1 && $6);
4261
add_join_natural($6,$1,NULL,Select);
3811
4263
if (!($$= lex->current_select->convert_right_join()))
3818
4270
| INNER_SYM JOIN_SYM {}
3819
| CROSS JOIN_SYM { Lex->is_cross= true; }
3823
4275
This is a flattening of the rules <table factor> and <table primary>
3824
4276
in the SQL:2003 standard, since we don't have <sample clause>
3827
4279
<table factor> ::= <table primary> [ <sample clause> ]
3829
4281
/* Warning - may return NULL in case of incomplete SELECT */
4284
SELECT_LEX *sel= Select;
4285
sel->table_join_options= 0;
3833
4287
table_ident opt_table_alias opt_key_definition
3835
if (!($$= Lex->current_select->add_table_to_list(YYSession, $2, $3,
3838
Lex->current_select->pop_index_hints())))
3840
Lex->current_select->add_joined_table($$);
4289
if (!($$= Select->add_table_to_list(YYTHD, $2, $3,
4290
Select->get_table_join_options(),
4292
Select->pop_index_hints())))
4294
Select->add_joined_table($$);
3842
4296
| select_derived_init get_select_lex select_derived2
3845
Select_Lex *sel= lex->current_select;
4299
SELECT_LEX *sel= lex->current_select;
3848
4302
if (sel->set_braces(1))
3850
struct my_parse_error_st pass= { ER(ER_SYNTAX_ERROR), YYSession };
3851
my_parse_error(&pass);
4304
my_parse_error(ER(ER_SYNTAX_ERROR));
3854
4307
/* select in braces, can't contain global parameters */
3855
4308
if (sel->master_unit()->fake_select_lex)
3856
4309
sel->master_unit()->global_parameters=
3857
4310
sel->master_unit()->fake_select_lex;
3859
if ($2->init_nested_join(lex->session))
4312
if ($2->init_nested_join(lex->thd))
3862
4315
/* incomplete derived tables return NULL, we must be
3863
4316
nested in select_derived rule to be here. */
4904
5430
lex->lock_option= TL_READ;
4905
5431
mysql_init_select(lex);
4906
5432
lex->current_select->parsing_place= SELECT_LIST;
5433
bzero((char*) &lex->create_info,sizeof(lex->create_info));
4917
Session *session= YYSession;
4919
lex->sql_command= SQLCOM_SELECT;
4921
new(std::nothrow) statement::Show(session);
4922
if (lex->statement == NULL)
4925
std::string column_name= "Database";
4928
column_name.append(" (");
4929
column_name.append(Lex->wild->ptr());
4930
column_name.append(")");
4933
if (Lex->current_select->where)
4935
if (prepare_new_schema_table(session, lex, "SCHEMAS"))
4940
if (prepare_new_schema_table(session, lex, "SHOW_SCHEMAS"))
4944
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_NAME");
4945
my_field->is_autogenerated_name= false;
4946
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
4948
if (session->add_item_to_list(my_field))
4951
if (session->add_order_to_list(my_field, true))
4955
| TABLES opt_db show_wild
4958
Session *session= YYSession;
4960
lex->sql_command= SQLCOM_SELECT;
4962
statement::Show *select=
4963
new(std::nothrow) statement::Show(YYSession);
4965
lex->statement= select;
4967
if (lex->statement == NULL)
4971
std::string column_name= "Tables_in_";
4973
util::string::const_shared_ptr schema(session->schema());
4976
SchemaIdentifier identifier($2);
4977
column_name.append($2);
4978
lex->select_lex.db= $2;
4979
if (not plugin::StorageEngine::doesSchemaExist(identifier))
4981
my_error(ER_BAD_DB_ERROR, MYF(0), $2);
4983
select->setShowPredicate($2, "");
4985
else if (schema and not schema->empty())
4987
column_name.append(*schema);
4988
select->setShowPredicate(*schema, "");
4992
my_error(ER_NO_DB_ERROR, MYF(0));
4999
column_name.append(" (");
5000
column_name.append(Lex->wild->ptr());
5001
column_name.append(")");
5004
if (prepare_new_schema_table(YYSession, lex, "SHOW_TABLES"))
5007
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_NAME");
5008
my_field->is_autogenerated_name= false;
5009
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
5011
if (session->add_item_to_list(my_field))
5014
if (session->add_order_to_list(my_field, true))
5017
/* SHOW TEMPORARY TABLES */
5018
| TEMPORARY_SYM TABLES show_wild
5021
Session *session= YYSession;
5023
lex->sql_command= SQLCOM_SELECT;
5025
statement::Show *select=
5026
new(std::nothrow) statement::Show(YYSession);
5028
lex->statement= select;
5030
if (lex->statement == NULL)
5034
if (prepare_new_schema_table(YYSession, lex, "SHOW_TEMPORARY_TABLES"))
5037
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
5041
(session->lex->current_select->with_wild)++;
5044
/* SHOW TABLE STATUS */
5045
| TABLE_SYM STATUS_SYM opt_db show_wild
5048
lex->sql_command= SQLCOM_SELECT;
5049
statement::Show *select=
5050
new(std::nothrow) statement::Show(YYSession);
5052
lex->statement= select;
5054
if (lex->statement == NULL)
5057
Session *session= YYSession;
5059
std::string column_name= "Tables_in_";
5061
util::string::const_shared_ptr schema(session->schema());
5064
lex->select_lex.db= $3;
5066
SchemaIdentifier identifier($3);
5067
if (not plugin::StorageEngine::doesSchemaExist(identifier))
5069
my_error(ER_BAD_DB_ERROR, MYF(0), $3);
5072
select->setShowPredicate($3, "");
5076
select->setShowPredicate(*schema, "");
5080
my_error(ER_NO_DB_ERROR, MYF(0));
5084
if (prepare_new_schema_table(session, lex, "SHOW_TABLE_STATUS"))
5087
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
5091
(session->lex->current_select->with_wild)++;
5093
/* SHOW COLUMNS FROM table_name */
5094
| COLUMNS from_or_in table_ident opt_db show_wild
5097
Session *session= YYSession;
5098
statement::Show *select;
5100
lex->sql_command= SQLCOM_SELECT;
5102
select= new(std::nothrow) statement::Show(session);
5104
lex->statement= select;
5106
if (lex->statement == NULL)
5109
util::string::const_shared_ptr schema(session->schema());
5112
select->setShowPredicate($4, $3->table.str);
5114
else if ($3->db.str)
5116
select->setShowPredicate($3->db.str, $3->table.str);
5120
select->setShowPredicate(*schema, $3->table.str);
5124
my_error(ER_NO_DB_ERROR, MYF(0));
5129
drizzled::TableIdentifier identifier(select->getShowSchema().c_str(), $3->table.str);
5130
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
5132
my_error(ER_NO_SUCH_TABLE, MYF(0),
5133
select->getShowSchema().c_str(),
5138
if (prepare_new_schema_table(session, lex, "SHOW_COLUMNS"))
5141
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
5145
(session->lex->current_select->with_wild)++;
5148
/* SHOW INDEXES from table */
5440
DATABASES wild_and_where
5443
lex->sql_command= SQLCOM_SHOW_DATABASES;
5444
if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA))
5447
| opt_full TABLES opt_db wild_and_where
5450
lex->sql_command= SQLCOM_SHOW_TABLES;
5451
lex->select_lex.db= $3;
5452
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES))
5455
| TABLE_SYM STATUS_SYM opt_db wild_and_where
5458
lex->sql_command= SQLCOM_SHOW_TABLE_STATUS;
5459
lex->select_lex.db= $3;
5460
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLES))
5463
| OPEN_SYM TABLES opt_db wild_and_where
5466
lex->sql_command= SQLCOM_SHOW_OPEN_TABLES;
5467
lex->select_lex.db= $3;
5468
if (prepare_schema_table(YYTHD, lex, 0, SCH_OPEN_TABLES))
5471
| ENGINE_SYM known_storage_engines STATUS_SYM /* This should either go... well it should go */
5473
Lex->create_info.db_type= $2;
5474
Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS;
5476
| opt_full COLUMNS from_or_in table_ident opt_db wild_and_where
5479
lex->sql_command= SQLCOM_SHOW_FIELDS;
5482
if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS))
5485
| master_or_binary LOGS_SYM
5487
Lex->sql_command = SQLCOM_SHOW_BINLOGS;
5491
Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS;
5493
| BINLOG_SYM EVENTS_SYM binlog_in binlog_from
5496
lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS;
5497
} opt_limit_clause_init
5149
5498
| keys_or_index from_or_in table_ident opt_db where_clause
5152
Session *session= YYSession;
5153
statement::Show *select;
5155
lex->sql_command= SQLCOM_SELECT;
5157
select= new(std::nothrow) statement::Show(session);
5159
lex->statement= select;
5161
if (lex->statement == NULL)
5164
util::string::const_shared_ptr schema(session->schema());
5167
select->setShowPredicate($4, $3->table.str);
5169
else if ($3->db.str)
5171
select->setShowPredicate($3->db.str, $3->table.str);
5175
select->setShowPredicate(*schema, $3->table.str);
5179
my_error(ER_NO_DB_ERROR, MYF(0));
5184
drizzled::TableIdentifier identifier(select->getShowSchema().c_str(), $3->table.str);
5185
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
5187
my_error(ER_NO_SUCH_TABLE, MYF(0),
5188
select->getShowSchema().c_str(),
5193
if (prepare_new_schema_table(session, lex, "SHOW_INDEXES"))
5196
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
5200
(session->lex->current_select->with_wild)++;
5501
lex->sql_command= SQLCOM_SHOW_KEYS;
5504
if (prepare_schema_table(YYTHD, lex, $3, SCH_STATISTICS))
5202
5507
| COUNT_SYM '(' '*' ')' WARNINGS
5204
(void) create_select_for_variable("warning_count");
5206
lex->statement= new(std::nothrow) statement::Show(YYSession);
5207
if (lex->statement == NULL)
5508
{ (void) create_select_for_variable("warning_count"); }
5210
5509
| COUNT_SYM '(' '*' ')' ERRORS
5212
(void) create_select_for_variable("error_count");
5214
lex->statement= new(std::nothrow) statement::Show(YYSession);
5215
if (lex->statement == NULL)
5510
{ (void) create_select_for_variable("error_count"); }
5218
5511
| WARNINGS opt_limit_clause_init
5220
Lex->sql_command = SQLCOM_SHOW_WARNS;
5221
Lex->statement= new(std::nothrow) statement::ShowWarnings(YYSession);
5222
if (Lex->statement == NULL)
5512
{ Lex->sql_command = SQLCOM_SHOW_WARNS;}
5225
5513
| ERRORS opt_limit_clause_init
5227
Lex->sql_command = SQLCOM_SHOW_ERRORS;
5228
Lex->statement= new(std::nothrow) statement::ShowErrors(YYSession);
5229
if (Lex->statement == NULL)
5232
| opt_var_type STATUS_SYM show_wild
5235
lex->sql_command= SQLCOM_SELECT;
5237
new(std::nothrow) statement::Show(YYSession);
5238
if (lex->statement == NULL)
5241
Session *session= YYSession;
5243
if ($1 == OPT_GLOBAL)
5245
if (prepare_new_schema_table(session, lex, "GLOBAL_STATUS"))
5250
if (prepare_new_schema_table(session, lex, "SESSION_STATUS"))
5254
std::string key("Variable_name");
5255
std::string value("Value");
5257
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_NAME");
5258
my_field->is_autogenerated_name= false;
5259
my_field->set_name(key.c_str(), key.length(), system_charset_info);
5261
if (session->add_item_to_list(my_field))
5264
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_VALUE");
5265
my_field->is_autogenerated_name= false;
5266
my_field->set_name(value.c_str(), value.length(), system_charset_info);
5268
if (session->add_item_to_list(my_field))
5514
{ Lex->sql_command = SQLCOM_SHOW_ERRORS;}
5515
| opt_var_type STATUS_SYM wild_and_where
5518
lex->sql_command= SQLCOM_SHOW_STATUS;
5519
lex->option_type= $1;
5520
if (prepare_schema_table(YYTHD, lex, 0, SCH_STATUS))
5523
| opt_full PROCESSLIST_SYM
5524
{ Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;}
5525
| opt_var_type VARIABLES wild_and_where
5528
lex->sql_command= SQLCOM_SHOW_VARIABLES;
5529
lex->option_type= $1;
5530
if (prepare_schema_table(YYTHD, lex, 0, SCH_VARIABLES))
5533
| charset wild_and_where
5536
lex->sql_command= SQLCOM_SHOW_CHARSETS;
5537
if (prepare_schema_table(YYTHD, lex, 0, SCH_CHARSETS))
5540
| COLLATION_SYM wild_and_where
5543
lex->sql_command= SQLCOM_SHOW_COLLATIONS;
5544
if (prepare_schema_table(YYTHD, lex, 0, SCH_COLLATIONS))
5547
| CREATE DATABASE opt_if_not_exists ident
5549
Lex->sql_command=SQLCOM_SHOW_CREATE_DB;
5550
Lex->create_info.options=$3;
5271
5553
| CREATE TABLE_SYM table_ident
5274
lex->sql_command= SQLCOM_SELECT;
5275
statement::Show *select=
5276
new(std::nothrow) statement::Show(YYSession);
5278
lex->statement= select;
5280
if (lex->statement == NULL)
5283
Session *session= YYSession;
5285
if (prepare_new_schema_table(session, lex, "TABLE_SQL_DEFINITION"))
5288
util::string::const_shared_ptr schema(session->schema());
5291
select->setShowPredicate($3->db.str, $3->table.str);
5295
select->setShowPredicate(*schema, $3->table.str);
5299
my_error(ER_NO_DB_ERROR, MYF(0));
5303
std::string key("Table");
5304
std::string value("Create Table");
5306
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_NAME");
5307
my_field->is_autogenerated_name= false;
5308
my_field->set_name(key.c_str(), key.length(), system_charset_info);
5310
if (session->add_item_to_list(my_field))
5313
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_SQL_DEFINITION");
5314
my_field->is_autogenerated_name= false;
5315
my_field->set_name(value.c_str(), value.length(), system_charset_info);
5317
if (session->add_item_to_list(my_field))
5324
lex->sql_command= SQLCOM_SELECT;
5326
new(std::nothrow) statement::Show(YYSession);
5327
if (lex->statement == NULL)
5330
Session *session= YYSession;
5332
if (prepare_new_schema_table(session, lex, "PROCESSLIST"))
5335
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
5339
(session->lex->current_select->with_wild)++;
5342
| opt_var_type VARIABLES show_wild
5345
lex->sql_command= SQLCOM_SELECT;
5347
new(std::nothrow) statement::Show(YYSession);
5348
if (lex->statement == NULL)
5351
Session *session= YYSession;
5353
if ($1 == OPT_GLOBAL)
5355
if (prepare_new_schema_table(session, lex, "GLOBAL_VARIABLES"))
5360
if (prepare_new_schema_table(session, lex, "SESSION_VARIABLES"))
5364
std::string key("Variable_name");
5365
std::string value("Value");
5367
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_NAME");
5368
my_field->is_autogenerated_name= false;
5369
my_field->set_name(key.c_str(), key.length(), system_charset_info);
5371
if (session->add_item_to_list(my_field))
5374
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_VALUE");
5375
my_field->is_autogenerated_name= false;
5376
my_field->set_name(value.c_str(), value.length(), system_charset_info);
5378
if (session->add_item_to_list(my_field))
5381
| CREATE DATABASE opt_if_not_exists ident
5384
lex->sql_command= SQLCOM_SELECT;
5385
statement::Show *select=
5386
new(std::nothrow) statement::Show(YYSession);
5388
lex->statement= select;
5390
if (lex->statement == NULL)
5393
Session *session= YYSession;
5395
if (prepare_new_schema_table(session, lex, "SCHEMA_SQL_DEFINITION"))
5398
util::string::const_shared_ptr schema(session->schema());
5401
select->setShowPredicate($4.str);
5405
select->setShowPredicate(*schema);
5409
my_error(ER_NO_DB_ERROR, MYF(0));
5413
std::string key("Database");
5414
std::string value("Create Database");
5416
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_NAME");
5417
my_field->is_autogenerated_name= false;
5418
my_field->set_name(key.c_str(), key.length(), system_charset_info);
5420
if (session->add_item_to_list(my_field))
5423
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_SQL_DEFINITION");
5424
my_field->is_autogenerated_name= false;
5425
my_field->set_name(value.c_str(), value.length(), system_charset_info);
5427
if (session->add_item_to_list(my_field))
5556
lex->sql_command = SQLCOM_SHOW_CREATE;
5557
if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL,0))
5560
| MASTER_SYM STATUS_SYM
5562
Lex->sql_command = SQLCOM_SHOW_MASTER_STAT;
5566
Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT;
5432
5575
/* empty */ { $$= 0; }
5433
5576
| from_or_in ident { $$= $2.str; }
5580
/* empty */ { Lex->verbose=0; }
5581
| FULL { Lex->verbose=1; }
5590
/* empty */ { Lex->mi.log_file_name = 0; }
5591
| IN_SYM TEXT_STRING_sys { Lex->mi.log_file_name = $2.str; }
5595
/* empty */ { Lex->mi.pos = 4; /* skip magic number */ }
5596
| FROM ulonglong_num { Lex->mi.pos = $2; }
5443
5601
| LIKE TEXT_STRING_sys
5445
Lex->wild= new (YYSession->mem_root) String($2.str, $2.length,
5603
Lex->wild= new (YYTHD->mem_root) String($2.str, $2.length,
5446
5604
system_charset_info);
5447
if (Lex->wild == NULL)
5452
Lex->current_select->where= $2;
5454
5610
$2->top_level_item();
5964
6212
simple_ident_q:
5965
6213
ident '.' ident
5967
Session *session= YYSession;
5968
LEX *lex= session->lex;
5971
Select_Lex *sel= lex->current_select;
6219
SELECT_LEX *sel= lex->current_select;
5972
6220
if (sel->no_table_names_allowed)
5974
6222
my_error(ER_TABLENAME_NOT_ALLOWED_HERE,
5975
MYF(0), $1.str, session->where);
6223
MYF(0), $1.str, thd->where);
5977
6225
$$= (sel->parsing_place != IN_HAVING ||
5978
6226
sel->get_in_sum_expr() > 0) ?
5979
(Item*) new Item_field(Lex->current_context(),
5980
(const char *)NULL, $1.str, $3.str) :
5981
(Item*) new Item_ref(Lex->current_context(),
5982
(const char *)NULL, $1.str, $3.str);
6227
(Item*) new Item_field(Lex->current_context(), NullS, $1.str, $3.str) :
6228
(Item*) new Item_ref(Lex->current_context(), NullS, $1.str, $3.str);
5985
6231
| '.' ident '.' ident
5987
Session *session= YYSession;
5988
LEX *lex= session->lex;
5989
Select_Lex *sel= lex->current_select;
5990
if (sel->no_table_names_allowed)
5992
my_error(ER_TABLENAME_NOT_ALLOWED_HERE,
5993
MYF(0), $2.str, session->where);
5995
$$= (sel->parsing_place != IN_HAVING ||
5996
sel->get_in_sum_expr() > 0) ?
5997
(Item*) new Item_field(Lex->current_context(), NULL, $2.str, $4.str) :
6235
SELECT_LEX *sel= lex->current_select;
6236
if (sel->no_table_names_allowed)
6238
my_error(ER_TABLENAME_NOT_ALLOWED_HERE,
6239
MYF(0), $2.str, thd->where);
6241
$$= (sel->parsing_place != IN_HAVING ||
6242
sel->get_in_sum_expr() > 0) ?
6243
(Item*) new Item_field(Lex->current_context(), NullS, $2.str, $4.str) :
6244
(Item*) new Item_ref(Lex->current_context(), NullS, $2.str, $4.str);
6246
| ident '.' ident '.' ident
6250
SELECT_LEX *sel= lex->current_select;
6251
if (sel->no_table_names_allowed)
6253
my_error(ER_TABLENAME_NOT_ALLOWED_HERE,
6254
MYF(0), $3.str, thd->where);
6256
$$= (sel->parsing_place != IN_HAVING ||
6257
sel->get_in_sum_expr() > 0) ?
6258
(Item*) new Item_field(Lex->current_context(),
6259
(YYTHD->client_capabilities &
6260
CLIENT_NO_SCHEMA ? NullS : $1.str),
5998
6262
(Item*) new Item_ref(Lex->current_context(),
5999
(const char *)NULL, $2.str, $4.str);
6001
| ident '.' ident '.' ident
6003
Session *session= YYSession;
6004
LEX *lex= session->lex;
6005
Select_Lex *sel= lex->current_select;
6006
if (sel->no_table_names_allowed)
6008
my_error(ER_TABLENAME_NOT_ALLOWED_HERE,
6009
MYF(0), $3.str, session->where);
6011
$$= (sel->parsing_place != IN_HAVING ||
6012
sel->get_in_sum_expr() > 0) ?
6013
(Item*) new Item_field(Lex->current_context(), $1.str, $3.str,
6015
(Item*) new Item_ref(Lex->current_context(), $1.str, $3.str,
6263
(YYTHD->client_capabilities &
6264
CLIENT_NO_SCHEMA ? NullS : $1.str),