37
37
Add full support for the variable character_set (for 4.1)
40
Be careful with var->save_result: sys_var::check() only updates
41
uint64_t_value; so other members of the union are garbage then; to use
42
them you must first assign a value to them (in specific ::check() for
42
#include <drizzled/option.h>
43
#include <drizzled/error.h>
44
#include <drizzled/gettext.h>
45
#include <drizzled/tztime.h>
46
#include <drizzled/data_home.h>
47
#include <drizzled/set_var.h>
48
#include <drizzled/session.h>
49
#include <drizzled/sql_base.h>
50
#include <drizzled/lock.h>
51
#include <drizzled/item/uint.h>
52
#include <drizzled/item/null.h>
53
#include <drizzled/item/float.h>
54
#include <drizzled/item/string.h>
55
#include <drizzled/plugin.h>
56
#include <drizzled/version.h>
57
#include <drizzled/strfunc.h>
58
#include <drizzled/internal/m_string.h>
59
#include <drizzled/pthread_globals.h>
60
#include <drizzled/charset.h>
61
#include <drizzled/transaction_services.h>
62
#include <drizzled/constrained_value.h>
63
#include <drizzled/visibility.h>
64
#include <drizzled/typelib.h>
65
#include <drizzled/plugin/storage_engine.h>
47
#include "drizzled/option.h"
48
#include "drizzled/error.h"
49
#include "drizzled/gettext.h"
50
#include "drizzled/tztime.h"
51
#include "drizzled/data_home.h"
52
#include "drizzled/set_var.h"
53
#include "drizzled/session.h"
54
#include "drizzled/sql_base.h"
55
#include "drizzled/lock.h"
56
#include "drizzled/item/uint.h"
57
#include "drizzled/item/null.h"
58
#include "drizzled/item/float.h"
59
#include "drizzled/item/string.h"
60
#include "drizzled/plugin.h"
61
#include "drizzled/version.h"
62
#include "drizzled/strfunc.h"
63
#include "drizzled/internal/m_string.h"
64
#include "drizzled/pthread_globals.h"
65
#include "drizzled/charset.h"
66
#include "drizzled/transaction_services.h"
67
#include "drizzled/constrained_value.h"
114
110
static void fix_max_join_size(Session *session, sql_var_t type);
115
111
static void fix_session_mem_root(Session *session, sql_var_t type);
116
112
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);
117
115
bool throw_bounds_warning(Session *session, bool fixed, bool unsignd,
118
116
const std::string &name, int64_t val);
119
117
static unsigned char *get_error_count(Session *session);
158
156
&drizzle_system_variables::join_buff_size);
159
157
static sys_var_session_uint32_t sys_max_allowed_packet("max_allowed_packet",
160
158
&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
161
static sys_var_session_uint64_t sys_max_error_count("max_error_count",
162
162
&drizzle_system_variables::max_error_count);
163
163
static sys_var_session_uint64_t sys_max_heap_table_size("max_heap_table_size",
220
220
static sys_var_session_size_t sys_sort_buffer("sort_buffer_size",
221
221
&drizzle_system_variables::sortbuff_size);
223
static sys_var_size_t_ptr_readonly sys_transaction_message_threshold("transaction_message_threshold",
224
&transaction_message_threshold);
223
static sys_var_session_size_t sys_transaction_message_threshold("transaction_message_threshold",
224
&drizzle_system_variables::transaction_message_threshold);
226
226
static sys_var_session_storage_engine sys_storage_engine("storage_engine",
227
227
&drizzle_system_variables::storage_engine);
228
static sys_var_const_str sys_system_time_zone("system_time_zone",
228
230
static sys_var_size_t_ptr sys_table_def_size("table_definition_cache",
229
231
&table_def_size);
230
232
static sys_var_uint64_t_ptr sys_table_cache_size("table_open_cache",
313
315
sys_var_session_uint64_t sys_group_concat_max_len("group_concat_max_len",
314
316
&drizzle_system_variables::group_concat_max_len);
318
sys_var_session_time_zone sys_time_zone("time_zone");
316
320
/* Global read-only variable containing hostname */
317
static sys_var_const_string sys_hostname("hostname", getServerHostname());
319
static sys_var_const_str sys_revid("vc_revid", DRIZZLE7_VC_REVID);
320
static sys_var_const_str sys_branch("vc_branch", DRIZZLE7_VC_BRANCH);
321
static sys_var_size_t_ptr_readonly sys_revno("vc_revno", &revno);
322
static sys_var_size_t_ptr_readonly sys_release_id("vc_release_id", &release_id);
321
static sys_var_const_str sys_hostname("hostname", glob_hostname);
324
323
bool sys_var::check(Session *session, set_var *var)
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);
478
518
bool sys_var_uint32_t_ptr::check(Session *, set_var *var)
520
var->save_result.uint32_t_value= (uint32_t)var->value->val_int();
484
524
bool sys_var_uint32_t_ptr::update(Session *session, set_var *var)
486
uint64_t tmp= var->getInteger();
487
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
526
uint32_t tmp= var->save_result.uint32_t_value;
527
LOCK_global_system_variables.lock();
489
528
if (option_limits)
491
530
uint32_t newvalue= (uint32_t) fix_unsigned(session, tmp, option_limits);
492
if(static_cast<uint64_t>(newvalue) == tmp)
493
532
*value= newvalue;
497
*value= static_cast<uint32_t>(tmp);
535
*value= (uint32_t) tmp;
536
LOCK_global_system_variables.unlock();
504
void sys_var_uint32_t_ptr::set_default(Session *session, sql_var_t)
541
void sys_var_uint32_t_ptr::set_default(Session *, sql_var_t)
507
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
544
LOCK_global_system_variables.lock();
508
545
*value= (uint32_t)getopt_ull_limit_value((uint32_t) option_limits->def_value,
509
546
option_limits, ¬_used);
547
LOCK_global_system_variables.unlock();
513
551
bool sys_var_uint64_t_ptr::update(Session *session, set_var *var)
515
uint64_t tmp= var->getInteger();
516
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
553
uint64_t tmp= var->save_result.uint64_t_value;
554
LOCK_global_system_variables.lock();
518
555
if (option_limits)
520
uint64_t newvalue= fix_unsigned(session, tmp, option_limits);
557
uint64_t newvalue= (uint64_t) fix_unsigned(session, tmp, option_limits);
521
558
if(newvalue==tmp)
522
559
*value= newvalue;
562
*value= (uint64_t) tmp;
563
LOCK_global_system_variables.unlock();
533
void sys_var_uint64_t_ptr::set_default(Session *session, sql_var_t)
568
void sys_var_uint64_t_ptr::set_default(Session *, sql_var_t)
535
570
if (have_default_value)
542
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
577
LOCK_global_system_variables.lock();
543
578
*value= getopt_ull_limit_value((uint64_t) option_limits->def_value,
544
579
option_limits, ¬_used);
580
LOCK_global_system_variables.unlock();
549
585
bool sys_var_size_t_ptr::update(Session *session, set_var *var)
551
size_t tmp= size_t(var->getInteger());
553
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
587
size_t tmp= var->save_result.size_t_value;
588
LOCK_global_system_variables.lock();
555
589
if (option_limits)
556
590
*value= fix_size_t(session, tmp, option_limits);
593
LOCK_global_system_variables.unlock();
564
void sys_var_size_t_ptr::set_default(Session *session, sql_var_t)
598
void sys_var_size_t_ptr::set_default(Session *, sql_var_t)
567
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
601
LOCK_global_system_variables.lock();
568
602
*value= (size_t)getopt_ull_limit_value((size_t) option_limits->def_value,
569
603
option_limits, ¬_used);
572
bool sys_var_bool_ptr::check(Session *session, set_var *var)
574
return check_enum(session, var, &bool_typelib);
604
LOCK_global_system_variables.unlock();
577
607
bool sys_var_bool_ptr::update(Session *, set_var *var)
579
*value= bool(var->getInteger());
609
*value= (bool) var->save_result.uint32_t_value;
593
623
bool sys_var_session_uint32_t::check(Session *session, set_var *var)
596
return (check_func && (*check_func)(session, var));
625
return (get_unsigned32(session, var) ||
626
(check_func && (*check_func)(session, var)));
599
629
bool sys_var_session_uint32_t::update(Session *session, set_var *var)
601
uint64_t tmp= var->getInteger();
631
uint64_t tmp= (uint64_t) var->save_result.uint32_t_value;
603
633
/* Don't use bigger value than given with --maximum-variable-name=.. */
604
634
if ((uint32_t) tmp > max_system_variables.*offset)
682
710
/* We will not come here if option_limits is not set */
683
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
711
LOCK_global_system_variables.lock();
684
712
global_system_variables.*offset=
685
713
(ha_rows) getopt_ull_limit_value((ha_rows) option_limits->def_value,
686
714
option_limits, ¬_used);
715
LOCK_global_system_variables.unlock();
690
718
session->variables.*offset= global_system_variables.*offset;
704
731
bool sys_var_session_uint64_t::check(Session *session, set_var *var)
707
return (check_func && (*check_func)(session, var));
733
return (get_unsigned64(session, var) ||
734
(check_func && (*check_func)(session, var)));
710
737
bool sys_var_session_uint64_t::update(Session *session, set_var *var)
712
uint64_t tmp= var->getInteger();
739
uint64_t tmp= var->save_result.uint64_t_value;
714
741
if (tmp > max_system_variables.*offset)
763
787
bool sys_var_session_size_t::check(Session *session, set_var *var)
766
return (check_func && (*check_func)(session, var));
789
return (get_size_t(session, var) ||
790
(check_func && (*check_func)(session, var)));
769
793
bool sys_var_session_size_t::update(Session *session, set_var *var)
771
size_t tmp= size_t(var->getInteger());
795
size_t tmp= var->save_result.size_t_value;
773
797
if (tmp > max_system_variables.*offset)
774
798
tmp= max_system_variables.*offset;
816
837
return (unsigned char*) &(session->variables.*offset);
819
bool sys_var_session_bool::check(Session *session, set_var *var)
821
return check_enum(session, var, &bool_typelib);
824
841
bool sys_var_session_bool::update(Session *session, set_var *var)
826
843
if (var->type == OPT_GLOBAL)
827
global_system_variables.*offset= bool(var->getInteger());
844
global_system_variables.*offset= (bool) var->save_result.uint32_t_value;
829
session->variables.*offset= bool(var->getInteger());
846
session->variables.*offset= (bool) var->save_result.uint32_t_value;
861
877
if (var->value->result_type() == STRING_RESULT)
863
res= var->value->val_str(&str);
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)
883
value= res ? res->c_ptr() : "NULL";
870
uint64_t tmp_val= enum_names->find_type(res->ptr(), res->length(), true);
876
var->setValue(tmp_val-1);
887
var->save_result.uint32_t_value--;
880
uint64_t tmp= var->value->val_int();
891
uint64_t tmp=var->value->val_int();
881
892
if (tmp >= enum_names->count)
883
894
internal::llstr(tmp,buff);
884
895
value=buff; // Wrong value is here
887
var->setValue(tmp); // Save for update
898
var->save_result.uint32_t_value= (uint32_t) tmp; // Save for update
923
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
934
LOCK_global_system_variables.lock();
924
935
value= *(uint*) value_ptr(session, var_type, base);
936
LOCK_global_system_variables.unlock();
926
937
return new Item_uint((uint64_t) value);
928
939
case SHOW_LONGLONG:
931
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
942
LOCK_global_system_variables.lock();
932
943
value= *(int64_t*) value_ptr(session, var_type, base);
944
LOCK_global_system_variables.unlock();
934
945
return new Item_int(value);
936
947
case SHOW_DOUBLE:
940
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
941
value= *(double*) value_ptr(session, var_type, base);
950
LOCK_global_system_variables.lock();
951
value= *(double*) value_ptr(session, var_type, base);
952
LOCK_global_system_variables.unlock();
944
953
/* 6, as this is for now only used with microseconds */
945
954
return new Item_float(value, 6);
947
956
case SHOW_HA_ROWS:
950
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
959
LOCK_global_system_variables.lock();
951
960
value= *(ha_rows*) value_ptr(session, var_type, base);
961
LOCK_global_system_variables.unlock();
953
962
return new Item_int((uint64_t) value);
958
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
967
LOCK_global_system_variables.lock();
959
968
value= *(size_t*) value_ptr(session, var_type, base);
969
LOCK_global_system_variables.unlock();
961
970
return new Item_int((uint64_t) value);
963
972
case SHOW_MY_BOOL:
966
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
975
LOCK_global_system_variables.lock();
967
976
value= *(bool*) value_ptr(session, var_type, base);
977
LOCK_global_system_variables.unlock();
968
978
return new Item_int(value,1);
970
980
case SHOW_CHAR_PTR:
973
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
983
LOCK_global_system_variables.lock();
974
984
char *str= *(char**) value_ptr(session, var_type, base);
983
993
tmp= new Item_null();
984
994
tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
996
LOCK_global_system_variables.unlock();
992
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
1002
LOCK_global_system_variables.lock();
993
1003
char *str= (char*) value_ptr(session, var_type, base);
995
1005
tmp= new Item_string(str, strlen(str),
1074
1090
String str(buff,sizeof(buff), system_charset_info), *res;
1075
1091
if (!(res=var->value->val_str(&str)))
1077
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string("NULL")));
1093
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name.c_str(), "NULL");
1080
1096
if (!(tmp=get_charset_by_name(res->c_ptr())))
1082
1098
my_error(ER_UNKNOWN_COLLATION, MYF(0), res->c_ptr());
1083
boost::throw_exception(invalid_option_value(var->var->getName()) << invalid_value(std::string(res->c_ptr())));
1092
1107
internal::int10_to_str((int) var->value->val_int(), buf, -10);
1093
1108
my_error(ER_UNKNOWN_COLLATION, MYF(0), buf);
1094
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)
1098
1119
if (var->type == OPT_GLOBAL)
1099
global_system_variables.*offset= tmp;
1120
global_system_variables.*offset= var->save_result.charset;
1102
session->variables.*offset= tmp;
1123
session->variables.*offset= var->save_result.charset;
1131
1152
bool sys_var_timestamp::update(Session *session, set_var *var)
1133
session->set_time(time_t(var->getInteger()));
1154
session->set_time((time_t) var->save_result.uint64_t_value);
1138
1159
void sys_var_timestamp::set_default(Session *session, sql_var_t)
1140
session->resetUserTime();
1161
session->user_time=0;
1144
1165
unsigned char *sys_var_timestamp::value_ptr(Session *session, sql_var_t,
1145
1166
const LEX_STRING *)
1147
session->sys_var_tmp.int32_t_value= (int32_t) session->getCurrentTimestampEpoch();
1168
session->sys_var_tmp.int32_t_value= (int32_t) session->start_time;
1148
1169
return (unsigned char*) &session->sys_var_tmp.int32_t_value;
1152
1173
bool sys_var_last_insert_id::update(Session *session, set_var *var)
1154
session->first_successful_insert_id_in_prev_stmt= var->getInteger();
1175
session->first_successful_insert_id_in_prev_stmt=
1176
var->save_result.uint64_t_value;
1169
1191
return (unsigned char*) &session->sys_var_tmp.uint64_t_value;
1172
bool sys_var_session_lc_time_names::update(Session *session, set_var *var)
1195
bool sys_var_session_time_zone::check(Session *session, set_var *var)
1197
char buff[MAX_TIME_ZONE_NAME_LENGTH];
1198
String str(buff, sizeof(buff), &my_charset_utf8_general_ci);
1199
String *res= var->value->val_str(&str);
1201
if (!(var->save_result.time_zone= my_tz_find(session, res)))
1203
my_error(ER_UNKNOWN_TIME_ZONE, MYF(0), res ? res->c_ptr() : "NULL");
1210
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1212
/* We are using Time_zone object found during check() phase. */
1213
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();
1220
session->variables.time_zone= var->save_result.time_zone;
1225
unsigned char *sys_var_session_time_zone::value_ptr(Session *session,
1230
We can use ptr() instead of c_ptr() here because String contaning
1231
time zone name is guaranteed to be zero ended.
1233
if (type == OPT_GLOBAL)
1234
return (unsigned char *)(global_system_variables.time_zone->get_name()->ptr());
1238
This is an ugly fix for replication: we don't replicate properly queries
1239
invoking system variables' values to update tables; but
1240
CONVERT_TZ(,,@@session.time_zone) is so popular that we make it
1241
replicable (i.e. we tell the binlog code to store the session
1242
timezone). If it's the global value which was used we can't replicate
1243
(binlog code stores session value only).
1245
return (unsigned char *)(session->variables.time_zone->get_name()->ptr());
1250
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();
1273
bool sys_var_session_lc_time_names::check(Session *, set_var *var)
1174
1275
MY_LOCALE *locale_match;
1286
1396
static bool set_option_autocommit(Session *session, set_var *var)
1289
1398
/* The test is negative as the flag we use is NOT autocommit */
1291
1400
uint64_t org_options= session->options;
1292
uint64_t new_options= session->options;
1294
if (var->getInteger() != 0)
1295
new_options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1402
if (var->save_result.uint32_t_value != 0)
1403
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1297
new_options|= ((sys_var_session_bit*) var->var)->bit_flag;
1405
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1299
if ((org_options ^ new_options) & OPTION_NOT_AUTOCOMMIT)
1407
if ((org_options ^ session->options) & OPTION_NOT_AUTOCOMMIT)
1301
1409
if ((org_options & OPTION_NOT_AUTOCOMMIT))
1303
success= session->endActiveTransaction();
1304
1411
/* We changed to auto_commit mode */
1305
1412
session->options&= ~(uint64_t) (OPTION_BEGIN);
1306
1413
session->server_status|= SERVER_STATUS_AUTOCOMMIT;
1414
TransactionServices &transaction_services= TransactionServices::singleton();
1415
if (transaction_services.commitTransaction(session, true))
1310
1420
session->server_status&= ~SERVER_STATUS_AUTOCOMMIT;
1314
if (var->getInteger() != 0)
1315
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1317
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1325
1426
static int check_pseudo_thread_id(Session *, set_var *var)
1428
var->save_result.uint64_t_value= var->value->val_int();
1498
1599
add_sys_var_to_list(&sys_back_log, my_long_options);
1499
1600
add_sys_var_to_list(&sys_basedir, my_long_options);
1500
1601
add_sys_var_to_list(&sys_big_selects, my_long_options);
1501
add_sys_var_to_list(&sys_branch, my_long_options);
1502
1602
add_sys_var_to_list(&sys_buffer_results, my_long_options);
1503
1603
add_sys_var_to_list(&sys_bulk_insert_buff_size, my_long_options);
1504
1604
add_sys_var_to_list(&sys_collation_server, my_long_options);
1514
1614
add_sys_var_to_list(&sys_last_insert_id, my_long_options);
1515
1615
add_sys_var_to_list(&sys_lc_time_names, my_long_options);
1516
1616
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);
1517
1618
add_sys_var_to_list(&sys_max_error_count, my_long_options);
1518
1619
add_sys_var_to_list(&sys_max_heap_table_size, my_long_options);
1519
1620
add_sys_var_to_list(&sys_max_join_size, my_long_options);
1533
1634
add_sys_var_to_list(&sys_range_alloc_block_size, my_long_options);
1534
1635
add_sys_var_to_list(&sys_read_buff_size, my_long_options);
1535
1636
add_sys_var_to_list(&sys_read_rnd_buff_size, my_long_options);
1536
add_sys_var_to_list(&sys_release_id, my_long_options);
1537
1637
add_sys_var_to_list(&sys_replicate_query, my_long_options);
1538
add_sys_var_to_list(&sys_revid, my_long_options);
1539
add_sys_var_to_list(&sys_revno, my_long_options);
1540
1638
add_sys_var_to_list(&sys_scheduler, my_long_options);
1541
1639
add_sys_var_to_list(&sys_secure_file_priv, my_long_options);
1542
1640
add_sys_var_to_list(&sys_select_limit, my_long_options);
1545
1643
add_sys_var_to_list(&sys_sql_notes, my_long_options);
1546
1644
add_sys_var_to_list(&sys_sql_warnings, my_long_options);
1547
1645
add_sys_var_to_list(&sys_storage_engine, my_long_options);
1646
add_sys_var_to_list(&sys_system_time_zone, my_long_options);
1548
1647
add_sys_var_to_list(&sys_table_cache_size, my_long_options);
1549
1648
add_sys_var_to_list(&sys_table_def_size, my_long_options);
1550
1649
add_sys_var_to_list(&sys_table_lock_wait_timeout, my_long_options);
1551
1650
add_sys_var_to_list(&sys_thread_stack_size, my_long_options);
1651
add_sys_var_to_list(&sys_time_zone, my_long_options);
1552
1652
add_sys_var_to_list(&sys_timed_mutexes, my_long_options);
1553
1653
add_sys_var_to_list(&sys_timestamp, my_long_options);
1554
1654
add_sys_var_to_list(&sys_tmp_table_size, my_long_options);
1611
1725
Functions to handle table_type
1612
1726
****************************************************************************/
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);
1614
1767
unsigned char *sys_var_session_storage_engine::value_ptr(Session *session,
1615
1768
sql_var_t type,
1616
1769
const LEX_STRING *)
1649
1802
bool sys_var_session_storage_engine::update(Session *session, set_var *var)
1651
char buff[STRING_BUFFER_USUAL_SIZE];
1652
const char *name_value;
1653
String str(buff, sizeof(buff), &my_charset_utf8_general_ci), *res;
1655
plugin::StorageEngine *tmp= NULL;
1656
plugin::StorageEngine **value= NULL;
1658
if (var->value->result_type() == STRING_RESULT)
1660
res= var->value->val_str(&str);
1661
if (res == NULL || res->ptr() == NULL)
1668
const std::string engine_name(res->ptr());
1669
tmp= plugin::StorageEngine::findByName(*session, engine_name);
1672
name_value= res->c_ptr();
1679
name_value= "unknown";
1682
value= &(global_system_variables.*offset);
1804
plugin::StorageEngine **value= &(global_system_variables.*offset), *old_value;
1683
1805
if (var->type != OPT_GLOBAL)
1684
1806
value= &(session->variables.*offset);
1808
if (old_value != var->save_result.storage_engine)
1810
*value= var->save_result.storage_engine;
1691
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name_value);
1695
1815
} /* namespace drizzled */