110
107
static void fix_max_join_size(Session *session, sql_var_t type);
111
108
static void fix_session_mem_root(Session *session, sql_var_t type);
112
109
static void fix_server_id(Session *session, sql_var_t type);
113
static bool get_unsigned32(Session *session, set_var *var);
114
static bool get_unsigned64(Session *session, set_var *var);
115
110
bool throw_bounds_warning(Session *session, bool fixed, bool unsignd,
116
111
const std::string &name, int64_t val);
117
112
static unsigned char *get_error_count(Session *session);
156
151
&drizzle_system_variables::join_buff_size);
157
152
static sys_var_session_uint32_t sys_max_allowed_packet("max_allowed_packet",
158
153
&drizzle_system_variables::max_allowed_packet);
159
static sys_var_uint64_t_ptr sys_max_connect_errors("max_connect_errors",
160
&max_connect_errors);
161
154
static sys_var_session_uint64_t sys_max_error_count("max_error_count",
162
155
&drizzle_system_variables::max_error_count);
163
156
static sys_var_session_uint64_t sys_max_heap_table_size("max_heap_table_size",
220
213
static sys_var_session_size_t sys_sort_buffer("sort_buffer_size",
221
214
&drizzle_system_variables::sortbuff_size);
223
static sys_var_session_size_t sys_transaction_message_threshold("transaction_message_threshold",
224
&drizzle_system_variables::transaction_message_threshold);
216
static sys_var_size_t_ptr_readonly sys_transaction_message_threshold("transaction_message_threshold",
217
&transaction_message_threshold);
226
219
static sys_var_session_storage_engine sys_storage_engine("storage_engine",
227
220
&drizzle_system_variables::storage_engine);
477
static bool get_unsigned32(Session *session, set_var *var)
479
if (var->value->unsigned_flag)
480
var->save_result.uint32_t_value=
481
static_cast<uint32_t>(var->value->val_int());
484
int64_t v= var->value->val_int();
486
throw_bounds_warning(session, true, true,var->var->getName().c_str(), v);
488
var->save_result.uint32_t_value=
489
static_cast<uint32_t>((v > UINT32_MAX) ? UINT32_MAX : (v < 0) ? 0 : v);
494
static bool get_unsigned64(Session *, set_var *var)
496
if (var->value->unsigned_flag)
497
var->save_result.uint64_t_value=(uint64_t) var->value->val_int();
500
int64_t v= var->value->val_int();
501
var->save_result.uint64_t_value= (uint64_t) ((v < 0) ? 0 : v);
506
static bool get_size_t(Session *, set_var *var)
508
if (var->value->unsigned_flag)
509
var->save_result.size_t_value= (size_t) var->value->val_int();
512
ssize_t v= (ssize_t)var->value->val_int();
513
var->save_result.size_t_value= (size_t) ((v < 0) ? 0 : v);
518
470
bool sys_var_uint32_t_ptr::check(Session *, set_var *var)
520
var->save_result.uint32_t_value= (uint32_t)var->value->val_int();
524
476
bool sys_var_uint32_t_ptr::update(Session *session, set_var *var)
526
uint32_t tmp= var->save_result.uint32_t_value;
527
LOCK_global_system_variables.lock();
478
uint64_t tmp= var->getInteger();
479
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
528
481
if (option_limits)
530
483
uint32_t newvalue= (uint32_t) fix_unsigned(session, tmp, option_limits);
484
if(static_cast<uint64_t>(newvalue) == tmp)
532
485
*value= newvalue;
535
*value= (uint32_t) tmp;
536
LOCK_global_system_variables.unlock();
489
*value= static_cast<uint32_t>(tmp);
541
void sys_var_uint32_t_ptr::set_default(Session *, sql_var_t)
496
void sys_var_uint32_t_ptr::set_default(Session *session, sql_var_t)
544
LOCK_global_system_variables.lock();
499
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
545
500
*value= (uint32_t)getopt_ull_limit_value((uint32_t) option_limits->def_value,
546
501
option_limits, ¬_used);
547
LOCK_global_system_variables.unlock();
551
505
bool sys_var_uint64_t_ptr::update(Session *session, set_var *var)
553
uint64_t tmp= var->save_result.uint64_t_value;
554
LOCK_global_system_variables.lock();
507
uint64_t tmp= var->getInteger();
508
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
555
510
if (option_limits)
557
uint64_t newvalue= (uint64_t) fix_unsigned(session, tmp, option_limits);
512
uint64_t newvalue= fix_unsigned(session, tmp, option_limits);
558
513
if(newvalue==tmp)
559
514
*value= newvalue;
562
*value= (uint64_t) tmp;
563
LOCK_global_system_variables.unlock();
568
void sys_var_uint64_t_ptr::set_default(Session *, sql_var_t)
525
void sys_var_uint64_t_ptr::set_default(Session *session, sql_var_t)
570
527
if (have_default_value)
577
LOCK_global_system_variables.lock();
534
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
578
535
*value= getopt_ull_limit_value((uint64_t) option_limits->def_value,
579
536
option_limits, ¬_used);
580
LOCK_global_system_variables.unlock();
585
541
bool sys_var_size_t_ptr::update(Session *session, set_var *var)
587
size_t tmp= var->save_result.size_t_value;
588
LOCK_global_system_variables.lock();
543
size_t tmp= size_t(var->getInteger());
545
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
589
547
if (option_limits)
590
548
*value= fix_size_t(session, tmp, option_limits);
593
LOCK_global_system_variables.unlock();
598
void sys_var_size_t_ptr::set_default(Session *, sql_var_t)
556
void sys_var_size_t_ptr::set_default(Session *session, sql_var_t)
601
LOCK_global_system_variables.lock();
559
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
602
560
*value= (size_t)getopt_ull_limit_value((size_t) option_limits->def_value,
603
561
option_limits, ¬_used);
604
LOCK_global_system_variables.unlock();
564
bool sys_var_bool_ptr::check(Session *session, set_var *var)
566
return check_enum(session, var, &bool_typelib);
607
569
bool sys_var_bool_ptr::update(Session *, set_var *var)
609
*value= (bool) var->save_result.uint32_t_value;
571
*value= bool(var->getInteger());
623
585
bool sys_var_session_uint32_t::check(Session *session, set_var *var)
625
return (get_unsigned32(session, var) ||
626
(check_func && (*check_func)(session, var)));
588
return (check_func && (*check_func)(session, var));
629
591
bool sys_var_session_uint32_t::update(Session *session, set_var *var)
631
uint64_t tmp= (uint64_t) var->save_result.uint32_t_value;
593
uint64_t tmp= var->getInteger();
633
595
/* Don't use bigger value than given with --maximum-variable-name=.. */
634
596
if ((uint32_t) tmp > max_system_variables.*offset)
710
674
/* We will not come here if option_limits is not set */
711
LOCK_global_system_variables.lock();
675
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
712
676
global_system_variables.*offset=
713
677
(ha_rows) getopt_ull_limit_value((ha_rows) option_limits->def_value,
714
678
option_limits, ¬_used);
715
LOCK_global_system_variables.unlock();
718
682
session->variables.*offset= global_system_variables.*offset;
731
696
bool sys_var_session_uint64_t::check(Session *session, set_var *var)
733
return (get_unsigned64(session, var) ||
734
(check_func && (*check_func)(session, var)));
699
return (check_func && (*check_func)(session, var));
737
702
bool sys_var_session_uint64_t::update(Session *session, set_var *var)
739
uint64_t tmp= var->save_result.uint64_t_value;
704
uint64_t tmp= var->getInteger();
741
706
if (tmp > max_system_variables.*offset)
787
755
bool sys_var_session_size_t::check(Session *session, set_var *var)
789
return (get_size_t(session, var) ||
790
(check_func && (*check_func)(session, var)));
758
return (check_func && (*check_func)(session, var));
793
761
bool sys_var_session_size_t::update(Session *session, set_var *var)
795
size_t tmp= var->save_result.size_t_value;
763
size_t tmp= size_t(var->getInteger());
797
765
if (tmp > max_system_variables.*offset)
798
766
tmp= max_system_variables.*offset;
837
808
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);
841
816
bool sys_var_session_bool::update(Session *session, set_var *var)
843
818
if (var->type == OPT_GLOBAL)
844
global_system_variables.*offset= (bool) var->save_result.uint32_t_value;
819
global_system_variables.*offset= bool(var->getInteger());
846
session->variables.*offset= (bool) var->save_result.uint32_t_value;
821
session->variables.*offset= bool(var->getInteger());
877
853
if (var->value->result_type() == STRING_RESULT)
879
if (!(res=var->value->val_str(&str)) ||
880
(var->save_result.uint32_t_value= find_type(enum_names, res->ptr(),
881
res->length(),1)) == 0)
855
res= var->value->val_str(&str);
883
value= res ? res->c_ptr() : "NULL";
887
var->save_result.uint32_t_value--;
862
uint64_t tmp_val= find_type(enum_names, res->ptr(), res->length(),1);
868
var->setValue(tmp_val-1);
891
uint64_t tmp=var->value->val_int();
872
uint64_t tmp= var->value->val_int();
892
873
if (tmp >= enum_names->count)
894
875
internal::llstr(tmp,buff);
895
876
value=buff; // Wrong value is here
898
var->save_result.uint32_t_value= (uint32_t) tmp; // Save for update
879
var->setValue(tmp); // Save for update
934
LOCK_global_system_variables.lock();
915
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
935
916
value= *(uint*) value_ptr(session, var_type, base);
936
LOCK_global_system_variables.unlock();
937
918
return new Item_uint((uint64_t) value);
939
920
case SHOW_LONGLONG:
942
LOCK_global_system_variables.lock();
923
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
943
924
value= *(int64_t*) value_ptr(session, var_type, base);
944
LOCK_global_system_variables.unlock();
945
926
return new Item_int(value);
947
928
case SHOW_DOUBLE:
950
LOCK_global_system_variables.lock();
951
value= *(double*) value_ptr(session, var_type, base);
952
LOCK_global_system_variables.unlock();
932
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
933
value= *(double*) value_ptr(session, var_type, base);
953
936
/* 6, as this is for now only used with microseconds */
954
937
return new Item_float(value, 6);
956
939
case SHOW_HA_ROWS:
959
LOCK_global_system_variables.lock();
942
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
960
943
value= *(ha_rows*) value_ptr(session, var_type, base);
961
LOCK_global_system_variables.unlock();
962
945
return new Item_int((uint64_t) value);
967
LOCK_global_system_variables.lock();
950
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
968
951
value= *(size_t*) value_ptr(session, var_type, base);
969
LOCK_global_system_variables.unlock();
970
953
return new Item_int((uint64_t) value);
972
955
case SHOW_MY_BOOL:
975
LOCK_global_system_variables.lock();
958
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
976
959
value= *(bool*) value_ptr(session, var_type, base);
977
LOCK_global_system_variables.unlock();
978
960
return new Item_int(value,1);
980
962
case SHOW_CHAR_PTR:
983
LOCK_global_system_variables.lock();
965
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
984
966
char *str= *(char**) value_ptr(session, var_type, base);
993
975
tmp= new Item_null();
994
976
tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
996
LOCK_global_system_variables.unlock();
1002
LOCK_global_system_variables.lock();
984
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
1003
985
char *str= (char*) value_ptr(session, var_type, base);
1005
987
tmp= new Item_string(str, strlen(str),
1090
1066
String str(buff,sizeof(buff), system_charset_info), *res;
1091
1067
if (!(res=var->value->val_str(&str)))
1093
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.c_str(), "NULL");
1069
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string("NULL")));
1096
1072
if (!(tmp=get_charset_by_name(res->c_ptr())))
1098
1074
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())));
1107
1084
internal::int10_to_str((int) var->value->val_int(), buf, -10);
1108
1085
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())));
1112
var->save_result.charset= tmp; // Save for update
1117
bool sys_var_collation_sv::update(Session *session, set_var *var)
1119
1090
if (var->type == OPT_GLOBAL)
1120
global_system_variables.*offset= var->save_result.charset;
1091
global_system_variables.*offset= tmp;
1123
session->variables.*offset= var->save_result.charset;
1094
session->variables.*offset= tmp;
1152
1123
bool sys_var_timestamp::update(Session *session, set_var *var)
1154
session->set_time((time_t) var->save_result.uint64_t_value);
1125
session->set_time(time_t(var->getInteger()));
1159
1130
void sys_var_timestamp::set_default(Session *session, sql_var_t)
1161
session->user_time=0;
1132
session->resetUserTime();
1165
1136
unsigned char *sys_var_timestamp::value_ptr(Session *session, sql_var_t,
1166
1137
const LEX_STRING *)
1168
session->sys_var_tmp.int32_t_value= (int32_t) session->start_time;
1139
session->sys_var_tmp.int32_t_value= (int32_t) session->getCurrentTimestampEpoch();
1169
1140
return (unsigned char*) &session->sys_var_tmp.int32_t_value;
1173
1144
bool sys_var_last_insert_id::update(Session *session, set_var *var)
1175
session->first_successful_insert_id_in_prev_stmt=
1176
var->save_result.uint64_t_value;
1146
session->first_successful_insert_id_in_prev_stmt= var->getInteger();
1195
bool sys_var_session_time_zone::check(Session *session, set_var *var)
1165
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1197
1167
char buff[MAX_TIME_ZONE_NAME_LENGTH];
1198
1168
String str(buff, sizeof(buff), &my_charset_utf8_general_ci);
1199
1169
String *res= var->value->val_str(&str);
1201
if (!(var->save_result.time_zone= my_tz_find(session, res)))
1171
Time_zone *tmp= my_tz_find(session, res);
1203
my_error(ER_UNKNOWN_TIME_ZONE, MYF(0), res ? res->c_ptr() : "NULL");
1174
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string(res ? res->c_ptr() : "NULL")));
1210
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1212
1177
/* We are using Time_zone object found during check() phase. */
1213
1178
if (var->type == OPT_GLOBAL)
1215
LOCK_global_system_variables.lock();
1216
global_system_variables.time_zone= var->save_result.time_zone;
1217
LOCK_global_system_variables.unlock();
1180
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
1181
global_system_variables.time_zone= tmp;
1220
session->variables.time_zone= var->save_result.time_zone;
1185
session->variables.time_zone= tmp;
1250
1217
void sys_var_session_time_zone::set_default(Session *session, sql_var_t type)
1252
LOCK_global_system_variables.lock();
1253
if (type == OPT_GLOBAL)
1255
if (default_tz_name)
1257
String str(default_tz_name, &my_charset_utf8_general_ci);
1259
We are guaranteed to find this time zone since its existence
1260
is checked during start-up.
1262
global_system_variables.time_zone= my_tz_find(session, &str);
1265
global_system_variables.time_zone= my_tz_SYSTEM;
1268
session->variables.time_zone= global_system_variables.time_zone;
1269
LOCK_global_system_variables.unlock();
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;
1273
bool sys_var_session_lc_time_names::check(Session *, set_var *var)
1240
bool sys_var_session_lc_time_names::update(Session *session, set_var *var)
1275
1242
MY_LOCALE *locale_match;
1396
1354
static bool set_option_autocommit(Session *session, set_var *var)
1398
1357
/* The test is negative as the flag we use is NOT autocommit */
1400
1359
uint64_t org_options= session->options;
1360
uint64_t new_options= session->options;
1402
if (var->save_result.uint32_t_value != 0)
1403
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1362
if (var->getInteger() != 0)
1363
new_options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1405
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1365
new_options|= ((sys_var_session_bit*) var->var)->bit_flag;
1407
if ((org_options ^ session->options) & OPTION_NOT_AUTOCOMMIT)
1367
if ((org_options ^ new_options) & OPTION_NOT_AUTOCOMMIT)
1409
1369
if ((org_options & OPTION_NOT_AUTOCOMMIT))
1371
success= session->endActiveTransaction();
1411
1372
/* We changed to auto_commit mode */
1412
1373
session->options&= ~(uint64_t) (OPTION_BEGIN);
1413
1374
session->server_status|= SERVER_STATUS_AUTOCOMMIT;
1414
TransactionServices &transaction_services= TransactionServices::singleton();
1415
if (transaction_services.commitTransaction(session, true))
1420
1378
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;
1426
1393
static int check_pseudo_thread_id(Session *, set_var *var)
1428
var->save_result.uint64_t_value= var->value->val_int();
1614
1581
add_sys_var_to_list(&sys_last_insert_id, my_long_options);
1615
1582
add_sys_var_to_list(&sys_lc_time_names, my_long_options);
1616
1583
add_sys_var_to_list(&sys_max_allowed_packet, my_long_options);
1617
add_sys_var_to_list(&sys_max_connect_errors, my_long_options);
1618
1584
add_sys_var_to_list(&sys_max_error_count, my_long_options);
1619
1585
add_sys_var_to_list(&sys_max_heap_table_size, my_long_options);
1620
1586
add_sys_var_to_list(&sys_max_join_size, my_long_options);
1725
1677
Functions to handle table_type
1726
1678
****************************************************************************/
1728
/* Based upon sys_var::check_enum() */
1730
bool sys_var_session_storage_engine::check(Session *session, set_var *var)
1732
char buff[STRING_BUFFER_USUAL_SIZE];
1734
String str(buff, sizeof(buff), &my_charset_utf8_general_ci), *res;
1736
var->save_result.storage_engine= NULL;
1737
if (var->value->result_type() == STRING_RESULT)
1739
res= var->value->val_str(&str);
1740
if (res == NULL || res->ptr() == NULL)
1747
const std::string engine_name(res->ptr());
1748
plugin::StorageEngine *engine;
1749
var->save_result.storage_engine= plugin::StorageEngine::findByName(*session, engine_name);
1750
if (var->save_result.storage_engine == NULL)
1752
value= res->c_ptr();
1755
engine= var->save_result.storage_engine;
1762
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), value);
1767
1680
unsigned char *sys_var_session_storage_engine::value_ptr(Session *session,
1768
1681
sql_var_t type,
1769
1682
const LEX_STRING *)
1802
1715
bool sys_var_session_storage_engine::update(Session *session, set_var *var)
1804
plugin::StorageEngine **value= &(global_system_variables.*offset), *old_value;
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);
1805
1749
if (var->type != OPT_GLOBAL)
1806
1750
value= &(session->variables.*offset);
1808
if (old_value != var->save_result.storage_engine)
1810
*value= var->save_result.storage_engine;
1757
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name_value);
1815
1761
} /* namespace drizzled */