mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
bugs in sys_var::val_* code
1. @@boolean_var differs from SHOW VARIABLES 2. @@str_var ignored variable charset (which is wrong for path variables that use filesystem charset) 3. @@signed_int_var in the string context was printed as unsigned
This commit is contained in:
@ -351,7 +351,7 @@ a
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
set global LC_MESSAGES=convert((@@global.log_bin_trust_function_creators)
|
set global LC_MESSAGES=convert((@@global.log_bin_trust_function_creators)
|
||||||
using cp1250);
|
using cp1250);
|
||||||
ERROR HY000: Unknown locale: '1'
|
ERROR HY000: Unknown locale: 'ON'
|
||||||
#
|
#
|
||||||
# Start of 5.6 tests
|
# Start of 5.6 tests
|
||||||
#
|
#
|
||||||
|
@ -274,9 +274,7 @@ do { \
|
|||||||
case SHOW_UINT: do_num_val (uint,CMD); \
|
case SHOW_UINT: do_num_val (uint,CMD); \
|
||||||
case SHOW_ULONG: do_num_val (ulong,CMD); \
|
case SHOW_ULONG: do_num_val (ulong,CMD); \
|
||||||
case SHOW_ULONGLONG:do_num_val (ulonglong,CMD); \
|
case SHOW_ULONGLONG:do_num_val (ulonglong,CMD); \
|
||||||
case SHOW_HA_ROWS: do_num_val (ha_rows,CMD); \
|
case SHOW_HA_ROWS: do_num_val (ha_rows,CMD);
|
||||||
case SHOW_BOOL: do_num_val (bool,CMD); \
|
|
||||||
case SHOW_MY_BOOL: do_num_val (my_bool,CMD)
|
|
||||||
|
|
||||||
#define case_for_double(CMD) \
|
#define case_for_double(CMD) \
|
||||||
case SHOW_DOUBLE: do_num_val (double,CMD)
|
case SHOW_DOUBLE: do_num_val (double,CMD)
|
||||||
@ -307,6 +305,7 @@ longlong sys_var::val_int(bool *is_null,
|
|||||||
case_get_string_as_lex_string;
|
case_get_string_as_lex_string;
|
||||||
case_for_integers(return val);
|
case_for_integers(return val);
|
||||||
case_for_double(return (longlong) val);
|
case_for_double(return (longlong) val);
|
||||||
|
case SHOW_MY_BOOL: return *(my_bool*)value;
|
||||||
default:
|
default:
|
||||||
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
||||||
return 0;
|
return 0;
|
||||||
@ -314,7 +313,7 @@ longlong sys_var::val_int(bool *is_null,
|
|||||||
|
|
||||||
longlong ret= 0;
|
longlong ret= 0;
|
||||||
if (!(*is_null= !sval.str))
|
if (!(*is_null= !sval.str))
|
||||||
ret= longlong_from_string_with_check(system_charset_info,
|
ret= longlong_from_string_with_check(charset(thd),
|
||||||
sval.str, sval.str + sval.length);
|
sval.str, sval.str + sval.length);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -322,18 +321,27 @@ longlong sys_var::val_int(bool *is_null,
|
|||||||
|
|
||||||
String *sys_var::val_str_nolock(String *str, THD *thd, const uchar *value)
|
String *sys_var::val_str_nolock(String *str, THD *thd, const uchar *value)
|
||||||
{
|
{
|
||||||
|
static LEX_STRING bools[]=
|
||||||
|
{
|
||||||
|
{ C_STRING_WITH_LEN("OFF") },
|
||||||
|
{ C_STRING_WITH_LEN("ON") }
|
||||||
|
};
|
||||||
|
|
||||||
LEX_STRING sval;
|
LEX_STRING sval;
|
||||||
switch (show_type())
|
switch (show_type())
|
||||||
{
|
{
|
||||||
case_get_string_as_lex_string;
|
case_get_string_as_lex_string;
|
||||||
case_for_integers(return str->set((ulonglong)val, system_charset_info) ? 0 : str);
|
case_for_integers(return str->set(val, system_charset_info) ? 0 : str);
|
||||||
case_for_double(return str->set_real(val, 6, system_charset_info) ? 0 : str);
|
case_for_double(return str->set_real(val, 6, system_charset_info) ? 0 : str);
|
||||||
|
case SHOW_MY_BOOL:
|
||||||
|
sval= bools[(int)*(my_bool*)value];
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sval.str || str->copy(sval.str, sval.length, system_charset_info))
|
if (!sval.str || str->copy(sval.str, sval.length, charset(thd)))
|
||||||
str= NULL;
|
str= NULL;
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -361,6 +369,7 @@ double sys_var::val_real(bool *is_null,
|
|||||||
case_get_string_as_lex_string;
|
case_get_string_as_lex_string;
|
||||||
case_for_integers(return val);
|
case_for_integers(return val);
|
||||||
case_for_double(return val);
|
case_for_double(return val);
|
||||||
|
case SHOW_MY_BOOL: return *(my_bool*)value;
|
||||||
default:
|
default:
|
||||||
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
my_error(ER_VAR_CANT_BE_READ, MYF(0), name.str);
|
||||||
return 0;
|
return 0;
|
||||||
@ -368,9 +377,8 @@ double sys_var::val_real(bool *is_null,
|
|||||||
|
|
||||||
double ret= 0;
|
double ret= 0;
|
||||||
if (!(*is_null= !sval.str))
|
if (!(*is_null= !sval.str))
|
||||||
ret= double_from_string_with_check(system_charset_info,
|
ret= double_from_string_with_check(charset(thd),
|
||||||
sval.str, sval.str + sval.length);
|
sval.str, sval.str + sval.length);
|
||||||
mysql_mutex_unlock(&LOCK_global_system_variables);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,8 +206,8 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
A pointer to a value of the variable for SHOW.
|
A pointer to a value of the variable for SHOW.
|
||||||
It must be of show_val_type type (bool for SHOW_BOOL, int for SHOW_INT,
|
It must be of show_val_type type (my_bool for SHOW_MY_BOOL,
|
||||||
longlong for SHOW_LONGLONG, etc).
|
int for SHOW_INT, longlong for SHOW_LONGLONG, etc).
|
||||||
*/
|
*/
|
||||||
virtual uchar *session_value_ptr(THD *thd, const LEX_STRING *base);
|
virtual uchar *session_value_ptr(THD *thd, const LEX_STRING *base);
|
||||||
virtual uchar *global_value_ptr(THD *thd, const LEX_STRING *base);
|
virtual uchar *global_value_ptr(THD *thd, const LEX_STRING *base);
|
||||||
|
@ -211,10 +211,12 @@ public:
|
|||||||
str_charset=cs;
|
str_charset=cs;
|
||||||
}
|
}
|
||||||
bool set_int(longlong num, bool unsigned_flag, CHARSET_INFO *cs);
|
bool set_int(longlong num, bool unsigned_flag, CHARSET_INFO *cs);
|
||||||
bool set(longlong num, CHARSET_INFO *cs)
|
bool set(int num, CHARSET_INFO *cs) { return set_int(num, false, cs); }
|
||||||
{ return set_int(num, false, cs); }
|
bool set(uint num, CHARSET_INFO *cs) { return set_int(num, true, cs); }
|
||||||
bool set(ulonglong num, CHARSET_INFO *cs)
|
bool set(long num, CHARSET_INFO *cs) { return set_int(num, false, cs); }
|
||||||
{ return set_int((longlong)num, true, cs); }
|
bool set(ulong num, CHARSET_INFO *cs) { return set_int(num, true, cs); }
|
||||||
|
bool set(longlong num, CHARSET_INFO *cs) { return set_int(num, false, cs); }
|
||||||
|
bool set(ulonglong num, CHARSET_INFO *cs) { return set_int((longlong)num, true, cs); }
|
||||||
bool set_real(double num,uint decimals, CHARSET_INFO *cs);
|
bool set_real(double num,uint decimals, CHARSET_INFO *cs);
|
||||||
|
|
||||||
/* Move handling of buffer from some other object to String */
|
/* Move handling of buffer from some other object to String */
|
||||||
|
Reference in New Issue
Block a user