Commit 18ef02b0 authored by Sachin Setiya's avatar Sachin Setiya

MDEV-4774 Strangeness with max_binlog_stmt_cache_size Settings

Problem:- When setting max_binlog_stmt_cache_size=18446744073709547520
from either command line or .cnf file, server fails to start.

Solution:- Added one more function eval_num_suffix_ull , which uses
strtoull to get unsigned ulonglong from string. And getopt_ull calls this
function instead of eval_num_suffix. Also changed previous eval_num_suffix to
eval_num_suffix_ll to remain consistent.
parent fbcdc343
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709547520
set global max_binlog_stmt_cache_size= 18446744073709547520;
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709547520
set global max_binlog_stmt_cache_size= 18446744073709547519;
Warnings:
Warning 1292 Truncated incorrect max_binlog_stmt_cache_size value: '18446744073709547519'
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709543424
set global max_binlog_stmt_cache_size= 18446744073709551615;
Warnings:
Warning 1292 Truncated incorrect max_binlog_stmt_cache_size value: '18446744073709551615'
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709547520
set global max_binlog_stmt_cache_size= 18446744073709551614;
Warnings:
Warning 1292 Truncated incorrect max_binlog_stmt_cache_size value: '18446744073709551614'
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709547520
set global max_binlog_stmt_cache_size= 18446744073709551616;
ERROR 42000: Incorrect argument type to variable 'max_binlog_stmt_cache_size'
select @@max_binlog_stmt_cache_size;
@@max_binlog_stmt_cache_size
18446744073709547520
set global max_binlog_stmt_cache_size= 18446744073709547520;
--max_binlog_stmt_cache_size=18446744073709547520
source include/have_log_bin.inc;
select @@max_binlog_stmt_cache_size;
--let $cache_size=`select @@max_binlog_stmt_cache_size;`
set global max_binlog_stmt_cache_size= 18446744073709547520;
select @@max_binlog_stmt_cache_size;
set global max_binlog_stmt_cache_size= 18446744073709547519;
select @@max_binlog_stmt_cache_size;
set global max_binlog_stmt_cache_size= 18446744073709551615;
select @@max_binlog_stmt_cache_size;
set global max_binlog_stmt_cache_size= 18446744073709551614;
select @@max_binlog_stmt_cache_size;
--error ER_WRONG_TYPE_FOR_VAR
set global max_binlog_stmt_cache_size= 18446744073709551616;
select @@max_binlog_stmt_cache_size;
--eval set global max_binlog_stmt_cache_size= $cache_size
......@@ -895,15 +895,39 @@ my_bool getopt_compare_strings(register const char *s, register const char *t,
/*
function: eval_num_suffix
Transforms suffix like k/m/g to their real value.
*/
static inline long eval_num_suffix(char *suffix, int *error)
{
long num= 1;
if (*suffix == 'k' || *suffix == 'K')
num*= 1024L;
else if (*suffix == 'm' || *suffix == 'M')
num*= 1024L * 1024L;
else if (*suffix == 'g' || *suffix == 'G')
num*= 1024L * 1024L * 1024L;
else if (*suffix)
{
*error= 1;
return 0;
}
return num;
}
/*
function: eval_num_suffix_ll
Transforms a number with a suffix to real number. Suffix can
be k|K for kilo, m|M for mega or g|G for giga.
*/
static longlong eval_num_suffix(char *argument, int *error, char *option_name)
static longlong eval_num_suffix_ll(char *argument,
int *error, char *option_name)
{
char *endchar;
longlong num;
DBUG_ENTER("eval_num_suffix");
DBUG_ENTER("eval_num_suffix_ll");
*error= 0;
......@@ -916,23 +940,47 @@ static longlong eval_num_suffix(char *argument, int *error, char *option_name)
*error= 1;
DBUG_RETURN(0);
}
if (*endchar == 'k' || *endchar == 'K')
num*= 1024L;
else if (*endchar == 'm' || *endchar == 'M')
num*= 1024L * 1024L;
else if (*endchar == 'g' || *endchar == 'G')
num*= 1024L * 1024L * 1024L;
else if (*endchar)
{
num*= eval_num_suffix(endchar, error);
if (*error)
fprintf(stderr,
"Unknown suffix '%c' used for variable '%s' (value '%s')\n",
*endchar, option_name, argument);
DBUG_RETURN(num);
}
/*
function: eval_num_suffix_ull
Transforms a number with a suffix to positive Integer. Suffix can
be k|K for kilo, m|M for mega or g|G for giga.
*/
static ulonglong eval_num_suffix_ull(char *argument,
int *error, char *option_name)
{
char *endchar;
ulonglong num;
DBUG_ENTER("eval_num_suffix_ull");
*error= 0;
errno= 0;
num= strtoull(argument, &endchar, 10);
if (errno == ERANGE)
{
my_getopt_error_reporter(ERROR_LEVEL,
"Incorrect integer value: '%s'", argument);
*error= 1;
DBUG_RETURN(0);
}
num*= eval_num_suffix(endchar, error);
if (*error)
fprintf(stderr,
"Unknown suffix '%c' used for variable '%s' (value '%s')\n",
*endchar, option_name, argument);
DBUG_RETURN(num);
}
/*
function: getopt_ll
......@@ -946,7 +994,7 @@ static longlong eval_num_suffix(char *argument, int *error, char *option_name)
static longlong getopt_ll(char *arg, const struct my_option *optp, int *err)
{
longlong num=eval_num_suffix(arg, err, (char*) optp->name);
longlong num=eval_num_suffix_ll(arg, err, (char*) optp->name);
return getopt_ll_limit_value(num, optp, NULL);
}
......@@ -1023,7 +1071,7 @@ longlong getopt_ll_limit_value(longlong num, const struct my_option *optp,
static ulonglong getopt_ull(char *arg, const struct my_option *optp, int *err)
{
ulonglong num= eval_num_suffix(arg, err, (char*) optp->name);
ulonglong num= eval_num_suffix_ull(arg, err, (char*) optp->name);
return getopt_ull_limit_value(num, optp, NULL);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment