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"
313
312
sys_var_session_uint64_t sys_group_concat_max_len("group_concat_max_len",
314
313
&drizzle_system_variables::group_concat_max_len);
315
sys_var_session_time_zone sys_time_zone("time_zone");
316
317
/* 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);
324
bool sys_var::check(Session *session, set_var *var)
318
static sys_var_const_str sys_hostname("hostname", glob_hostname);
320
bool sys_var::check(Session *, set_var *var)
329
if ((res=(*check_func)(session, var)) < 0)
330
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();
337
326
bool sys_var_str::check(Session *session, set_var *var)
343
332
if ((res=(*check_func)(session, var)) < 0)
344
333
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), getName().c_str(), var->value->str_value.ptr());
348
bool sys_var_std_string::check(Session *session, set_var *var)
350
if (check_func == NULL)
355
int res= (*check_func)(session, var);
358
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), getName().c_str(), var->value->str_value.ptr());
365
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);
478
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();
484
498
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());
500
uint32_t tmp= var->save_result.uint32_t_value;
501
LOCK_global_system_variables.lock();
489
502
if (option_limits)
491
504
uint32_t newvalue= (uint32_t) fix_unsigned(session, tmp, option_limits);
492
if(static_cast<uint64_t>(newvalue) == tmp)
493
506
*value= newvalue;
497
*value= static_cast<uint32_t>(tmp);
509
*value= (uint32_t) tmp;
510
LOCK_global_system_variables.unlock();
504
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)
507
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
518
LOCK_global_system_variables.lock();
508
519
*value= (uint32_t)getopt_ull_limit_value((uint32_t) option_limits->def_value,
509
520
option_limits, ¬_used);
521
LOCK_global_system_variables.unlock();
513
525
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());
527
uint64_t tmp= var->save_result.uint64_t_value;
528
LOCK_global_system_variables.lock();
518
529
if (option_limits)
520
uint64_t newvalue= fix_unsigned(session, tmp, option_limits);
531
uint64_t newvalue= (uint64_t) fix_unsigned(session, tmp, option_limits);
521
532
if(newvalue==tmp)
522
533
*value= newvalue;
536
*value= (uint64_t) tmp;
537
LOCK_global_system_variables.unlock();
533
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)
535
if (have_default_value)
537
*value= default_value;
542
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
543
*value= getopt_ull_limit_value((uint64_t) option_limits->def_value,
544
option_limits, ¬_used);
545
LOCK_global_system_variables.lock();
546
*value= getopt_ull_limit_value((uint64_t) option_limits->def_value,
547
option_limits, ¬_used);
548
LOCK_global_system_variables.unlock();
549
552
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());
554
size_t tmp= var->save_result.size_t_value;
555
LOCK_global_system_variables.lock();
555
556
if (option_limits)
556
557
*value= fix_size_t(session, tmp, option_limits);
560
LOCK_global_system_variables.unlock();
564
void sys_var_size_t_ptr::set_default(Session *session, sql_var_t)
565
void sys_var_size_t_ptr::set_default(Session *, sql_var_t)
567
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
568
LOCK_global_system_variables.lock();
568
569
*value= (size_t)getopt_ull_limit_value((size_t) option_limits->def_value,
569
570
option_limits, ¬_used);
572
bool sys_var_bool_ptr::check(Session *session, set_var *var)
574
return check_enum(session, var, &bool_typelib);
571
LOCK_global_system_variables.unlock();
577
574
bool sys_var_bool_ptr::update(Session *, set_var *var)
579
*value= bool(var->getInteger());
576
*value= (bool) var->save_result.uint32_t_value;
584
581
void sys_var_bool_ptr::set_default(Session *, sql_var_t)
586
*value= default_value;
583
*value= (bool) option_limits->def_value;
861
844
if (var->value->result_type() == STRING_RESULT)
863
res= var->value->val_str(&str);
846
if (!(res=var->value->val_str(&str)) ||
847
(var->save_result.uint32_t_value= find_type(enum_names, res->ptr(),
848
res->length(),1)) == 0)
850
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);
854
var->save_result.uint32_t_value--;
880
uint64_t tmp= var->value->val_int();
858
uint64_t tmp=var->value->val_int();
881
859
if (tmp >= enum_names->count)
883
861
internal::llstr(tmp,buff);
884
862
value=buff; // Wrong value is here
887
var->setValue(tmp); // Save for update
865
var->save_result.uint32_t_value= (uint32_t) tmp; // Save for update
923
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
901
LOCK_global_system_variables.lock();
924
902
value= *(uint*) value_ptr(session, var_type, base);
903
LOCK_global_system_variables.unlock();
926
904
return new Item_uint((uint64_t) value);
928
906
case SHOW_LONGLONG:
931
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
909
LOCK_global_system_variables.lock();
932
910
value= *(int64_t*) value_ptr(session, var_type, base);
911
LOCK_global_system_variables.unlock();
934
912
return new Item_int(value);
936
914
case SHOW_DOUBLE:
940
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
941
value= *(double*) value_ptr(session, var_type, base);
917
LOCK_global_system_variables.lock();
918
value= *(double*) value_ptr(session, var_type, base);
919
LOCK_global_system_variables.unlock();
944
920
/* 6, as this is for now only used with microseconds */
945
921
return new Item_float(value, 6);
947
923
case SHOW_HA_ROWS:
950
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
926
LOCK_global_system_variables.lock();
951
927
value= *(ha_rows*) value_ptr(session, var_type, base);
928
LOCK_global_system_variables.unlock();
953
929
return new Item_int((uint64_t) value);
958
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
934
LOCK_global_system_variables.lock();
959
935
value= *(size_t*) value_ptr(session, var_type, base);
936
LOCK_global_system_variables.unlock();
961
937
return new Item_int((uint64_t) value);
963
939
case SHOW_MY_BOOL:
966
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
942
LOCK_global_system_variables.lock();
967
943
value= *(bool*) value_ptr(session, var_type, base);
944
LOCK_global_system_variables.unlock();
968
945
return new Item_int(value,1);
970
947
case SHOW_CHAR_PTR:
973
boost::mutex::scoped_lock scopedLock(session->catalog().systemVariableLock());
950
LOCK_global_system_variables.lock();
974
951
char *str= *(char**) value_ptr(session, var_type, base);
1131
1119
bool sys_var_timestamp::update(Session *session, set_var *var)
1133
session->set_time(time_t(var->getInteger()));
1121
session->set_time((time_t) var->save_result.uint64_t_value);
1138
1126
void sys_var_timestamp::set_default(Session *session, sql_var_t)
1140
session->resetUserTime();
1128
session->user_time=0;
1144
1132
unsigned char *sys_var_timestamp::value_ptr(Session *session, sql_var_t,
1145
1133
const LEX_STRING *)
1147
session->sys_var_tmp.int32_t_value= (int32_t) session->getCurrentTimestampEpoch();
1135
session->sys_var_tmp.int32_t_value= (int32_t) session->start_time;
1148
1136
return (unsigned char*) &session->sys_var_tmp.int32_t_value;
1152
1140
bool sys_var_last_insert_id::update(Session *session, set_var *var)
1154
session->first_successful_insert_id_in_prev_stmt= var->getInteger();
1142
session->first_successful_insert_id_in_prev_stmt=
1143
var->save_result.uint64_t_value;
1169
1158
return (unsigned char*) &session->sys_var_tmp.uint64_t_value;
1172
bool sys_var_session_lc_time_names::update(Session *session, set_var *var)
1162
bool sys_var_session_time_zone::check(Session *session, set_var *var)
1164
char buff[MAX_TIME_ZONE_NAME_LENGTH];
1165
String str(buff, sizeof(buff), &my_charset_utf8_general_ci);
1166
String *res= var->value->val_str(&str);
1168
if (!(var->save_result.time_zone= my_tz_find(session, res)))
1170
my_error(ER_UNKNOWN_TIME_ZONE, MYF(0), res ? res->c_ptr() : "NULL");
1177
bool sys_var_session_time_zone::update(Session *session, set_var *var)
1179
/* We are using Time_zone object found during check() phase. */
1180
if (var->type == OPT_GLOBAL)
1182
LOCK_global_system_variables.lock();
1183
global_system_variables.time_zone= var->save_result.time_zone;
1184
LOCK_global_system_variables.unlock();
1187
session->variables.time_zone= var->save_result.time_zone;
1192
unsigned char *sys_var_session_time_zone::value_ptr(Session *session,
1197
We can use ptr() instead of c_ptr() here because String contaning
1198
time zone name is guaranteed to be zero ended.
1200
if (type == OPT_GLOBAL)
1201
return (unsigned char *)(global_system_variables.time_zone->get_name()->ptr());
1205
This is an ugly fix for replication: we don't replicate properly queries
1206
invoking system variables' values to update tables; but
1207
CONVERT_TZ(,,@@session.time_zone) is so popular that we make it
1208
replicable (i.e. we tell the binlog code to store the session
1209
timezone). If it's the global value which was used we can't replicate
1210
(binlog code stores session value only).
1212
return (unsigned char *)(session->variables.time_zone->get_name()->ptr());
1217
void sys_var_session_time_zone::set_default(Session *session, sql_var_t type)
1219
LOCK_global_system_variables.lock();
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;
1236
LOCK_global_system_variables.unlock();
1240
bool sys_var_session_lc_time_names::check(Session *, set_var *var)
1174
1242
MY_LOCALE *locale_match;
1286
1363
static bool set_option_autocommit(Session *session, set_var *var)
1289
1365
/* The test is negative as the flag we use is NOT autocommit */
1291
1367
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;
1369
if (var->save_result.uint32_t_value != 0)
1370
session->options&= ~((sys_var_session_bit*) var->var)->bit_flag;
1297
new_options|= ((sys_var_session_bit*) var->var)->bit_flag;
1372
session->options|= ((sys_var_session_bit*) var->var)->bit_flag;
1299
if ((org_options ^ new_options) & OPTION_NOT_AUTOCOMMIT)
1374
if ((org_options ^ session->options) & OPTION_NOT_AUTOCOMMIT)
1301
1376
if ((org_options & OPTION_NOT_AUTOCOMMIT))
1303
success= session->endActiveTransaction();
1304
1378
/* We changed to auto_commit mode */
1305
1379
session->options&= ~(uint64_t) (OPTION_BEGIN);
1306
1380
session->server_status|= SERVER_STATUS_AUTOCOMMIT;
1381
TransactionServices &transaction_services= TransactionServices::singleton();
1382
if (transaction_services.commitTransaction(session, true))
1310
1387
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
1393
static int check_pseudo_thread_id(Session *, set_var *var)
1395
var->save_result.uint64_t_value= var->value->val_int();
1545
1609
add_sys_var_to_list(&sys_sql_notes, my_long_options);
1546
1610
add_sys_var_to_list(&sys_sql_warnings, my_long_options);
1547
1611
add_sys_var_to_list(&sys_storage_engine, my_long_options);
1612
add_sys_var_to_list(&sys_system_time_zone, my_long_options);
1548
1613
add_sys_var_to_list(&sys_table_cache_size, my_long_options);
1549
1614
add_sys_var_to_list(&sys_table_def_size, my_long_options);
1550
1615
add_sys_var_to_list(&sys_table_lock_wait_timeout, my_long_options);
1551
1616
add_sys_var_to_list(&sys_thread_stack_size, my_long_options);
1617
add_sys_var_to_list(&sys_time_zone, my_long_options);
1552
1618
add_sys_var_to_list(&sys_timed_mutexes, my_long_options);
1553
1619
add_sys_var_to_list(&sys_timestamp, my_long_options);
1554
1620
add_sys_var_to_list(&sys_tmp_table_size, my_long_options);
1611
1691
Functions to handle table_type
1612
1692
****************************************************************************/
1694
/* Based upon sys_var::check_enum() */
1696
bool sys_var_session_storage_engine::check(Session *session, set_var *var)
1698
char buff[STRING_BUFFER_USUAL_SIZE];
1700
String str(buff, sizeof(buff), &my_charset_utf8_general_ci), *res;
1702
var->save_result.storage_engine= NULL;
1703
if (var->value->result_type() == STRING_RESULT)
1705
res= var->value->val_str(&str);
1706
if (res == NULL || res->ptr() == NULL)
1713
const std::string engine_name(res->ptr());
1714
plugin::StorageEngine *engine;
1715
var->save_result.storage_engine= plugin::StorageEngine::findByName(*session, engine_name);
1716
if (var->save_result.storage_engine == NULL)
1718
value= res->c_ptr();
1721
engine= var->save_result.storage_engine;
1728
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), value);
1614
1733
unsigned char *sys_var_session_storage_engine::value_ptr(Session *session,
1615
1734
sql_var_t type,
1616
1735
const LEX_STRING *)
1649
1768
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);
1770
plugin::StorageEngine **value= &(global_system_variables.*offset), *old_value;
1683
1771
if (var->type != OPT_GLOBAL)
1684
1772
value= &(session->variables.*offset);
1774
if (old_value != var->save_result.storage_engine)
1776
*value= var->save_result.storage_engine;
1691
my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), name_value);
1695
1781
} /* namespace drizzled */