107
111
static void fix_max_join_size(Session *session, sql_var_t type);
108
112
static void fix_session_mem_root(Session *session, sql_var_t type);
109
113
static void fix_server_id(Session *session, sql_var_t type);
114
static bool get_unsigned32(Session *session, set_var *var);
115
static bool get_unsigned64(Session *session, set_var *var);
110
116
bool throw_bounds_warning(Session *session, bool fixed, bool unsignd,
111
117
const std::string &name, int64_t val);
112
118
static unsigned char *get_error_count(Session *session);
151
157
&drizzle_system_variables::join_buff_size);
152
158
static sys_var_session_uint32_t sys_max_allowed_packet("max_allowed_packet",
153
159
&drizzle_system_variables::max_allowed_packet);
160
static sys_var_uint64_t_ptr sys_max_connect_errors("max_connect_errors",
161
&max_connect_errors);
154
162
static sys_var_session_uint64_t sys_max_error_count("max_error_count",
155
163
&drizzle_system_variables::max_error_count);
156
164
static sys_var_session_uint64_t sys_max_heap_table_size("max_heap_table_size",
190
198
static sys_var_session_size_t sys_range_alloc_block_size("range_alloc_block_size",
191
199
&drizzle_system_variables::range_alloc_block_size);
193
static sys_var_session_bool sys_replicate_query("replicate_query",
194
&drizzle_system_variables::replicate_query);
196
200
static sys_var_session_uint32_t sys_query_alloc_block_size("query_alloc_block_size",
197
201
&drizzle_system_variables::query_alloc_block_size,
198
202
NULL, fix_session_mem_root);
213
217
static sys_var_session_size_t sys_sort_buffer("sort_buffer_size",
214
218
&drizzle_system_variables::sortbuff_size);
216
static sys_var_size_t_ptr_readonly sys_transaction_message_threshold("transaction_message_threshold",
217
&transaction_message_threshold);
220
static sys_var_session_size_t sys_transaction_message_threshold("transaction_message_threshold",
221
&drizzle_system_variables::transaction_message_threshold);
219
223
static sys_var_session_storage_engine sys_storage_engine("storage_engine",
220
224
&drizzle_system_variables::storage_engine);
313
317
/* Global read-only variable containing hostname */
314
318
static sys_var_const_str sys_hostname("hostname", glob_hostname);
316
bool sys_var::check(Session *session, set_var *var)
320
bool sys_var::check(Session *, set_var *var)
321
if ((res=(*check_func)(session, var)) < 0)
322
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), getName().c_str(), var->value->str_value.ptr());
322
var->save_result.uint64_t_value= var->value->val_int();
329
326
bool sys_var_str::check(Session *session, set_var *var)
335
332
if ((res=(*check_func)(session, var)) < 0)
336
333
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), getName().c_str(), var->value->str_value.ptr());
340
bool sys_var_std_string::check(Session *session, set_var *var)
342
if (check_func == NULL)
347
int res= (*check_func)(session, var);
350
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), getName().c_str(), var->value->str_value.ptr());
357
338
Functions to check and update variables
451
static bool get_unsigned32(Session *session, set_var *var)
453
if (var->value->unsigned_flag)
454
var->save_result.uint32_t_value=
455
static_cast<uint32_t>(var->value->val_int());
458
int64_t v= var->value->val_int();
460
throw_bounds_warning(session, true, true,var->var->getName().c_str(), v);
462
var->save_result.uint32_t_value=
463
static_cast<uint32_t>((v > UINT32_MAX) ? UINT32_MAX : (v < 0) ? 0 : v);
468
static bool get_unsigned64(Session *, set_var *var)
470
if (var->value->unsigned_flag)
471
var->save_result.uint64_t_value=(uint64_t) var->value->val_int();
474
int64_t v= var->value->val_int();
475
var->save_result.uint64_t_value= (uint64_t) ((v < 0) ? 0 : v);
480
static bool get_size_t(Session *, set_var *var)
482
if (var->value->unsigned_flag)
483
var->save_result.size_t_value= (size_t) var->value->val_int();
486
ssize_t v= (ssize_t)var->value->val_int();
487
var->save_result.size_t_value= (size_t) ((v < 0) ? 0 : v);
470
492
bool sys_var_uint32_t_ptr::check(Session *, set_var *var)
494
var->save_result.uint32_t_value= (uint32_t)var->value->val_int();
476
498
bool sys_var_uint32_t_ptr::update(Session *session, set_var *var)
478
uint64_t tmp= var->getInteger();
479
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
500
uint32_t tmp= var->save_result.uint32_t_value;
501
LOCK_global_system_variables.lock();
481
502
if (option_limits)
483
504
uint32_t newvalue= (uint32_t) fix_unsigned(session, tmp, option_limits);
484
if(static_cast<uint64_t>(newvalue) == tmp)
485
506
*value= newvalue;
489
*value= static_cast<uint32_t>(tmp);
509
*value= (uint32_t) tmp;
510
LOCK_global_system_variables.unlock();
496
void sys_var_uint32_t_ptr::set_default(Session *session, sql_var_t)
515
void sys_var_uint32_t_ptr::set_default(Session *, sql_var_t)
499
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
518
LOCK_global_system_variables.lock();
500
519
*value= (uint32_t)getopt_ull_limit_value((uint32_t) option_limits->def_value,
501
520
option_limits, ¬_used);
521
LOCK_global_system_variables.unlock();
505
525
bool sys_var_uint64_t_ptr::update(Session *session, set_var *var)
507
uint64_t tmp= var->getInteger();
508
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
527
uint64_t tmp= var->save_result.uint64_t_value;
528
LOCK_global_system_variables.lock();
510
529
if (option_limits)
512
uint64_t newvalue= fix_unsigned(session, tmp, option_limits);
531
uint64_t newvalue= (uint64_t) fix_unsigned(session, tmp, option_limits);
513
532
if(newvalue==tmp)
514
533
*value= newvalue;
536
*value= (uint64_t) tmp;
537
LOCK_global_system_variables.unlock();
525
void sys_var_uint64_t_ptr::set_default(Session *session, sql_var_t)
542
void sys_var_uint64_t_ptr::set_default(Session *, sql_var_t)
527
544
if (have_default_value)
534
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
551
LOCK_global_system_variables.lock();
535
552
*value= getopt_ull_limit_value((uint64_t) option_limits->def_value,
536
553
option_limits, ¬_used);
554
LOCK_global_system_variables.unlock();
541
559
bool sys_var_size_t_ptr::update(Session *session, set_var *var)
543
size_t tmp= size_t(var->getInteger());
545
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
561
size_t tmp= var->save_result.size_t_value;
562
LOCK_global_system_variables.lock();
547
563
if (option_limits)
548
564
*value= fix_size_t(session, tmp, option_limits);
567
LOCK_global_system_variables.unlock();
556
void sys_var_size_t_ptr::set_default(Session *session, sql_var_t)
572
void sys_var_size_t_ptr::set_default(Session *, sql_var_t)
559
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
575
LOCK_global_system_variables.lock();
560
576
*value= (size_t)getopt_ull_limit_value((size_t) option_limits->def_value,
561
577
option_limits, ¬_used);
564
bool sys_var_bool_ptr::check(Session *session, set_var *var)
566
return check_enum(session, var, &bool_typelib);
578
LOCK_global_system_variables.unlock();
569
581
bool sys_var_bool_ptr::update(Session *, set_var *var)
571
*value= bool(var->getInteger());
583
*value= (bool) var->save_result.uint32_t_value;
576
588
void sys_var_bool_ptr::set_default(Session *, sql_var_t)
578
*value= default_value;
590
*value= (bool) option_limits->def_value;
585
597
bool sys_var_session_uint32_t::check(Session *session, set_var *var)
588
return (check_func && (*check_func)(session, var));
599
return (get_unsigned32(session, var) ||
600
(check_func && (*check_func)(session, var)));
591
603
bool sys_var_session_uint32_t::update(Session *session, set_var *var)
593
uint64_t tmp= var->getInteger();
605
uint64_t tmp= (uint64_t) var->save_result.uint32_t_value;
595
607
/* Don't use bigger value than given with --maximum-variable-name=.. */
596
608
if ((uint32_t) tmp > max_system_variables.*offset)
674
684
/* We will not come here if option_limits is not set */
675
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
685
LOCK_global_system_variables.lock();
676
686
global_system_variables.*offset=
677
687
(ha_rows) getopt_ull_limit_value((ha_rows) option_limits->def_value,
678
688
option_limits, ¬_used);
689
LOCK_global_system_variables.unlock();
682
692
session->variables.*offset= global_system_variables.*offset;
696
705
bool sys_var_session_uint64_t::check(Session *session, set_var *var)
699
return (check_func && (*check_func)(session, var));
707
return (get_unsigned64(session, var) ||
708
(check_func && (*check_func)(session, var)));
702
711
bool sys_var_session_uint64_t::update(Session *session, set_var *var)
704
uint64_t tmp= var->getInteger();
713
uint64_t tmp= var->save_result.uint64_t_value;
706
715
if (tmp > max_system_variables.*offset)
755
761
bool sys_var_session_size_t::check(Session *session, set_var *var)
758
return (check_func && (*check_func)(session, var));
763
return (get_size_t(session, var) ||
764
(check_func && (*check_func)(session, var)));
761
767
bool sys_var_session_size_t::update(Session *session, set_var *var)
763
size_t tmp= size_t(var->getInteger());
769
size_t tmp= var->save_result.size_t_value;
765
771
if (tmp > max_system_variables.*offset)
766
772
tmp= max_system_variables.*offset;
808
811
return (unsigned char*) &(session->variables.*offset);
811
bool sys_var_session_bool::check(Session *session, set_var *var)
813
return check_enum(session, var, &bool_typelib);
816
815
bool sys_var_session_bool::update(Session *session, set_var *var)
818
817
if (var->type == OPT_GLOBAL)
819
global_system_variables.*offset= bool(var->getInteger());
818
global_system_variables.*offset= (bool) var->save_result.uint32_t_value;
821
session->variables.*offset= bool(var->getInteger());
820
session->variables.*offset= (bool) var->save_result.uint32_t_value;
853
851
if (var->value->result_type() == STRING_RESULT)
855
res= var->value->val_str(&str);
853
if (!(res=var->value->val_str(&str)) ||
854
(var->save_result.uint32_t_value= find_type(enum_names, res->ptr(),
855
res->length(),1)) == 0)
857
value= res ? res->c_ptr() : "NULL";
862
uint64_t tmp_val= find_type(enum_names, res->ptr(), res->length(),1);
868
var->setValue(tmp_val-1);
861
var->save_result.uint32_t_value--;
872
uint64_t tmp= var->value->val_int();
865
uint64_t tmp=var->value->val_int();
873
866
if (tmp >= enum_names->count)
875
868
internal::llstr(tmp,buff);
876
869
value=buff; // Wrong value is here
879
var->setValue(tmp); // Save for update
872
var->save_result.uint32_t_value= (uint32_t) tmp; // Save for update
915
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
908
LOCK_global_system_variables.lock();
916
909
value= *(uint*) value_ptr(session, var_type, base);
910
LOCK_global_system_variables.unlock();
918
911
return new Item_uint((uint64_t) value);
920
913
case SHOW_LONGLONG:
923
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
916
LOCK_global_system_variables.lock();
924
917
value= *(int64_t*) value_ptr(session, var_type, base);
918
LOCK_global_system_variables.unlock();
926
919
return new Item_int(value);
928
921
case SHOW_DOUBLE:
932
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
933
value= *(double*) value_ptr(session, var_type, base);
924
LOCK_global_system_variables.lock();
925
value= *(double*) value_ptr(session, var_type, base);
926
LOCK_global_system_variables.unlock();
936
927
/* 6, as this is for now only used with microseconds */
937
928
return new Item_float(value, 6);
939
930
case SHOW_HA_ROWS:
942
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
933
LOCK_global_system_variables.lock();
943
934
value= *(ha_rows*) value_ptr(session, var_type, base);
935
LOCK_global_system_variables.unlock();
945
936
return new Item_int((uint64_t) value);
950
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
941
LOCK_global_system_variables.lock();
951
942
value= *(size_t*) value_ptr(session, var_type, base);
943
LOCK_global_system_variables.unlock();
953
944
return new Item_int((uint64_t) value);
955
946
case SHOW_MY_BOOL:
958
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
949
LOCK_global_system_variables.lock();
959
950
value= *(bool*) value_ptr(session, var_type, base);
951
LOCK_global_system_variables.unlock();
960
952
return new Item_int(value,1);
962
954
case SHOW_CHAR_PTR:
965
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
957
LOCK_global_system_variables.lock();
966
958
char *str= *(char**) value_ptr(session, var_type, base);
975
967
tmp= new Item_null();
976
968
tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
970
LOCK_global_system_variables.unlock();
984
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
976
LOCK_global_system_variables.lock();
985
977
char *str= (char*) value_ptr(session, var_type, base);
987
979
tmp= new Item_string(str, strlen(str),
1066
1064
String str(buff,sizeof(buff), system_charset_info), *res;
1067
1065
if (!(res=var->value->val_str(&str)))
1069
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string("NULL")));
1067
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.c_str(), "NULL");
1072
1070
if (!(tmp=get_charset_by_name(res->c_ptr())))
1074
1072
my_error(ER_UNKNOWN_COLLATION, MYF(0), res->c_ptr());
1075
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string(res->c_ptr())));
1084
1081
internal::int10_to_str((int) var->value->val_int(), buf, -10);
1085
1082
my_error(ER_UNKNOWN_COLLATION, MYF(0), buf);
1086
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(boost::lexical_cast<std::string>(var->value->val_int())));
1086
var->save_result.charset= tmp; // Save for update
1091
bool sys_var_collation_sv::update(Session *session, set_var *var)
1090
1093
if (var->type == OPT_GLOBAL)
1091
global_system_variables.*offset= tmp;
1094
global_system_variables.*offset= var->save_result.charset;
1094
session->variables.*offset= tmp;
1097
session->variables.*offset= var->save_result.charset;
1123
1126
bool sys_var_timestamp::update(Session *session, set_var *var)
1125
session->set_time(time_t(var->getInteger()));
1128
session->set_time((time_t) var->save_result.uint64_t_value);
1130
1133
void sys_var_timestamp::set_default(Session *session, sql_var_t)
1132
session->resetUserTime();
1135
session->user_time=0;
1136
1139
unsigned char *sys_var_timestamp::value_ptr(Session *session, sql_var_t,
1137
1140
const LEX_STRING *)
1139
session->sys_var_tmp.int32_t_value= (int32_t) session->getCurrentTimestampEpoch();
1142
session->sys_var_tmp.int32_t_value= (int32_t) session->start_time;
1140
1143
return (unsigned char*) &session->sys_var_tmp.int32_t_value;
1144
1147
bool sys_var_last_insert_id::update(Session *session, set_var *var)
1146
session->first_successful_insert_id_in_prev_stmt= var->getInteger();
1149
session->first_successful_insert_id_in_prev_stmt=
1150
var->save_result.uint64_t_value;
1165
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1169
bool sys_var_session_time_zone::check(Session *session, set_var *var)
1167
1171
char buff[MAX_TIME_ZONE_NAME_LENGTH];
1168
1172
String str(buff, sizeof(buff), &my_charset_utf8_general_ci);
1169
1173
String *res= var->value->val_str(&str);
1171
Time_zone *tmp= my_tz_find(session, res);
1175
if (!(var->save_result.time_zone= my_tz_find(session, res)))
1174
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string(res ? res->c_ptr() : "NULL")));
1177
my_error(ER_UNKNOWN_TIME_ZONE, MYF(0), res ? res->c_ptr() : "NULL");
1184
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1177
1186
/* We are using Time_zone object found during check() phase. */
1178
1187
if (var->type == OPT_GLOBAL)
1180
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
1181
global_system_variables.time_zone= tmp;
1189
LOCK_global_system_variables.lock();
1190
global_system_variables.time_zone= var->save_result.time_zone;
1191
LOCK_global_system_variables.unlock();
1185
session->variables.time_zone= tmp;
1194
session->variables.time_zone= var->save_result.time_zone;
1217
1224
void sys_var_session_time_zone::set_default(Session *session, sql_var_t type)
1219
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
1220
if (type == OPT_GLOBAL)
1222
if (default_tz_name)
1224
String str(default_tz_name, &my_charset_utf8_general_ci);
1226
We are guaranteed to find this time zone since its existence
1227
is checked during start-up.
1229
global_system_variables.time_zone= my_tz_find(session, &str);
1232
global_system_variables.time_zone= my_tz_SYSTEM;
1235
session->variables.time_zone= global_system_variables.time_zone;
1226
LOCK_global_system_variables.lock();
1227
if (type == OPT_GLOBAL)
1229
if (default_tz_name)
1231
String str(default_tz_name, &my_charset_utf8_general_ci);
1233
We are guaranteed to find this time zone since its existence
1234
is checked during start-up.
1236
global_system_variables.time_zone= my_tz_find(session, &str);
1239
global_system_variables.time_zone= my_tz_SYSTEM;
1242
session->variables.time_zone= global_system_variables.time_zone;
1243
LOCK_global_system_variables.unlock();
1240
bool sys_var_session_lc_time_names::update(Session *session, set_var *var)
1247
bool sys_var_session_lc_time_names::check(Session *, set_var *var)
1242
1249
MY_LOCALE *locale_match;
1354
1370
static bool set_option_autocommit(Session *session, set_var *var)
1357
1372
/* The test is negative as the flag we use is NOT autocommit */
1359
1374
uint64_t org_options= session->options;
1360
uint64_t new_options= session->options;
1362
if (var->getInteger() != 0)
1363
new_options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1376
if (var->save_result.uint32_t_value != 0)
1377
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1365
new_options|= ((sys_var_session_bit*) var->var)->bit_flag;
1379
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1367
if ((org_options ^ new_options) & OPTION_NOT_AUTOCOMMIT)
1381
if ((org_options ^ session->options) & OPTION_NOT_AUTOCOMMIT)
1369
1383
if ((org_options & OPTION_NOT_AUTOCOMMIT))
1371
success= session->endActiveTransaction();
1372
1385
/* We changed to auto_commit mode */
1373
1386
session->options&= ~(uint64_t) (OPTION_BEGIN);
1374
1387
session->server_status|= SERVER_STATUS_AUTOCOMMIT;
1388
TransactionServices &transaction_services= TransactionServices::singleton();
1389
if (transaction_services.commitTransaction(session, true))
1378
1394
session->server_status&= ~SERVER_STATUS_AUTOCOMMIT;
1382
if (var->getInteger() != 0)
1383
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1385
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1393
1400
static int check_pseudo_thread_id(Session *, set_var *var)
1402
var->save_result.uint64_t_value= var->value->val_int();
1581
1588
add_sys_var_to_list(&sys_last_insert_id, my_long_options);
1582
1589
add_sys_var_to_list(&sys_lc_time_names, my_long_options);
1583
1590
add_sys_var_to_list(&sys_max_allowed_packet, my_long_options);
1591
add_sys_var_to_list(&sys_max_connect_errors, my_long_options);
1584
1592
add_sys_var_to_list(&sys_max_error_count, my_long_options);
1585
1593
add_sys_var_to_list(&sys_max_heap_table_size, my_long_options);
1586
1594
add_sys_var_to_list(&sys_max_join_size, my_long_options);
1600
1608
add_sys_var_to_list(&sys_range_alloc_block_size, my_long_options);
1601
1609
add_sys_var_to_list(&sys_read_buff_size, my_long_options);
1602
1610
add_sys_var_to_list(&sys_read_rnd_buff_size, my_long_options);
1603
add_sys_var_to_list(&sys_replicate_query, my_long_options);
1604
1611
add_sys_var_to_list(&sys_scheduler, my_long_options);
1605
1612
add_sys_var_to_list(&sys_secure_file_priv, my_long_options);
1606
1613
add_sys_var_to_list(&sys_select_limit, my_long_options);
1677
1698
Functions to handle table_type
1678
1699
****************************************************************************/
1701
/* Based upon sys_var::check_enum() */
1703
bool sys_var_session_storage_engine::check(Session *session, set_var *var)
1705
char buff[STRING_BUFFER_USUAL_SIZE];
1707
String str(buff, sizeof(buff), &my_charset_utf8_general_ci), *res;
1709
var->save_result.storage_engine= NULL;
1710
if (var->value->result_type() == STRING_RESULT)
1712
res= var->value->val_str(&str);
1713
if (res == NULL || res->ptr() == NULL)
1720
const std::string engine_name(res->ptr());
1721
plugin::StorageEngine *engine;
1722
var->save_result.storage_engine= plugin::StorageEngine::findByName(*session, engine_name);
1723
if (var->save_result.storage_engine == NULL)
1725
value= res->c_ptr();
1728
engine= var->save_result.storage_engine;
1735
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), value);
1680
1740
unsigned char *sys_var_session_storage_engine::value_ptr(Session *session,
1681
1741
sql_var_t type,
1682
1742
const LEX_STRING *)
1715
1775
bool sys_var_session_storage_engine::update(Session *session, set_var *var)
1717
char buff[STRING_BUFFER_USUAL_SIZE];
1718
const char *name_value;
1719
String str(buff, sizeof(buff), &my_charset_utf8_general_ci), *res;
1721
plugin::StorageEngine *tmp= NULL;
1722
plugin::StorageEngine **value= NULL;
1724
if (var->value->result_type() == STRING_RESULT)
1726
res= var->value->val_str(&str);
1727
if (res == NULL || res->ptr() == NULL)
1734
const std::string engine_name(res->ptr());
1735
tmp= plugin::StorageEngine::findByName(*session, engine_name);
1738
name_value= res->c_ptr();
1745
name_value= "unknown";
1748
value= &(global_system_variables.*offset);
1777
plugin::StorageEngine **value= &(global_system_variables.*offset), *old_value;
1749
1778
if (var->type != OPT_GLOBAL)
1750
1779
value= &(session->variables.*offset);
1781
if (old_value != var->save_result.storage_engine)
1783
*value= var->save_result.storage_engine;
1757
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name_value);
1761
1788
} /* namespace drizzled */