Commit 08dc6911 authored by jyang's avatar jyang

branches/zip: Fix an issue that a local variable defined

in innodb_file_format_check_validate() is being referenced
across function in innodb_file_format_check_update().
In addition, fix "set global innodb_file_format_check =
DEFAULT" call.
Bug #47167: "set global innodb_file_format_check" cannot
set value by User-Defined Variable."
rb://169 approved by Sunny Bains and Marko.
parent 33794558
...@@ -269,10 +269,10 @@ innobase_file_format_check_on_off( ...@@ -269,10 +269,10 @@ innobase_file_format_check_on_off(
/************************************************************//** /************************************************************//**
Validate the file format check config parameters, as a side effect it Validate the file format check config parameters, as a side effect it
sets the srv_check_file_format_at_startup variable. sets the srv_check_file_format_at_startup variable.
@return true if valid config value */ @return the format_id if valid config value, otherwise, return -1 */
static static
bool int
innobase_file_format_check_validate( innobase_file_format_validate_and_set(
/*================================*/ /*================================*/
const char* format_check); /*!< in: parameter value */ const char* format_check); /*!< in: parameter value */
/****************************************************************//** /****************************************************************//**
...@@ -2146,8 +2146,8 @@ mem_free_and_error: ...@@ -2146,8 +2146,8 @@ mem_free_and_error:
/* Did the user specify a format name that we support ? /* Did the user specify a format name that we support ?
As a side effect it will update the variable As a side effect it will update the variable
srv_check_file_format_at_startup */ srv_check_file_format_at_startup */
if (!innobase_file_format_check_validate( if (innobase_file_format_validate_and_set(
innobase_file_format_check)) { innobase_file_format_check) < 0) {
sql_print_error("InnoDB: invalid " sql_print_error("InnoDB: invalid "
"innodb_file_format_check value: " "innodb_file_format_check value: "
...@@ -9502,25 +9502,24 @@ innobase_file_format_check_on_off( ...@@ -9502,25 +9502,24 @@ innobase_file_format_check_on_off(
/************************************************************//** /************************************************************//**
Validate the file format check config parameters, as a side effect it Validate the file format check config parameters, as a side effect it
sets the srv_check_file_format_at_startup variable. sets the srv_check_file_format_at_startup variable.
@return true if valid config value */ @return the format_id if valid config value, otherwise, return -1 */
static static
bool int
innobase_file_format_check_validate( innobase_file_format_validate_and_set(
/*================================*/ /*================================*/
const char* format_check) /*!< in: parameter value */ const char* format_check) /*!< in: parameter value */
{ {
uint format_id; uint format_id;
bool ret = true;
format_id = innobase_file_format_name_lookup(format_check); format_id = innobase_file_format_name_lookup(format_check);
if (format_id < DICT_TF_FORMAT_MAX + 1) { if (format_id < DICT_TF_FORMAT_MAX + 1) {
srv_check_file_format_at_startup = format_id; srv_check_file_format_at_startup = format_id;
return((int) format_id);
} else { } else {
ret = false; return(-1);
} }
return(ret);
} }
/*************************************************************//** /*************************************************************//**
...@@ -9555,7 +9554,11 @@ innodb_file_format_name_validate( ...@@ -9555,7 +9554,11 @@ innodb_file_format_name_validate(
if (format_id <= DICT_TF_FORMAT_MAX) { if (format_id <= DICT_TF_FORMAT_MAX) {
*static_cast<const char**>(save) = file_format_input; /* Save a pointer to the name in the
'file_format_name_map' constant array. */
*static_cast<const char**>(save) =
trx_sys_file_format_id_to_name(format_id);
return(0); return(0);
} }
} }
...@@ -9618,6 +9621,7 @@ innodb_file_format_check_validate( ...@@ -9618,6 +9621,7 @@ innodb_file_format_check_validate(
const char* file_format_input; const char* file_format_input;
char buff[STRING_BUFFER_USUAL_SIZE]; char buff[STRING_BUFFER_USUAL_SIZE];
int len = sizeof(buff); int len = sizeof(buff);
int format_id;
ut_a(save != NULL); ut_a(save != NULL);
ut_a(value != NULL); ut_a(value != NULL);
...@@ -9630,24 +9634,35 @@ innodb_file_format_check_validate( ...@@ -9630,24 +9634,35 @@ innodb_file_format_check_validate(
message if they did so. */ message if they did so. */
if (innobase_file_format_check_on_off(file_format_input)) { if (innobase_file_format_check_on_off(file_format_input)) {
sql_print_warning( push_warning_printf(thd,
MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"InnoDB: invalid innodb_file_format_check " "InnoDB: invalid innodb_file_format_check "
"value; on/off can only be set at startup or " "value; on/off can only be set at startup or "
"in the configuration file"); "in the configuration file");
} else if (innobase_file_format_check_validate( } else {
file_format_input)) { format_id = innobase_file_format_validate_and_set(
file_format_input);
*static_cast<const char**>(save) = file_format_input; if (format_id >= 0) {
/* Save a pointer to the name in the
'file_format_name_map' constant array. */
*static_cast<const char**>(save) =
trx_sys_file_format_id_to_name(
(uint)format_id);
return(0); return(0);
} else { } else {
sql_print_warning( push_warning_printf(thd,
"InnoDB: invalid innodb_file_format_check " MYSQL_ERROR::WARN_LEVEL_WARN,
"value; can be any format up to %s " ER_WRONG_ARGUMENTS,
"or its equivalent numeric id", "InnoDB: invalid innodb_file_format_check "
trx_sys_file_format_id_to_name( "value; can be any format up to %s "
DICT_TF_FORMAT_MAX)); "or its equivalent numeric id",
trx_sys_file_format_id_to_name(
DICT_TF_FORMAT_MAX));
}
} }
} }
...@@ -9917,12 +9932,15 @@ static MYSQL_SYSVAR_STR(file_format, innobase_file_format_name, ...@@ -9917,12 +9932,15 @@ static MYSQL_SYSVAR_STR(file_format, innobase_file_format_name,
innodb_file_format_name_validate, innodb_file_format_name_validate,
innodb_file_format_name_update, "Antelope"); innodb_file_format_name_update, "Antelope");
/* If a new file format is introduced, the file format
name needs to be updated accordingly. Please refer to
file_format_name_map[] defined in trx0sys.c for the next
file format name. */
static MYSQL_SYSVAR_STR(file_format_check, innobase_file_format_check, static MYSQL_SYSVAR_STR(file_format_check, innobase_file_format_check,
PLUGIN_VAR_OPCMDARG, PLUGIN_VAR_OPCMDARG,
"The highest file format in the tablespace.", "The highest file format in the tablespace.",
innodb_file_format_check_validate, innodb_file_format_check_validate,
innodb_file_format_check_update, innodb_file_format_check_update, "Barracuda");
"on");
static MYSQL_SYSVAR_ULONG(flush_log_at_trx_commit, srv_flush_log_at_trx_commit, static MYSQL_SYSVAR_ULONG(flush_log_at_trx_commit, srv_flush_log_at_trx_commit,
PLUGIN_VAR_OPCMDARG, PLUGIN_VAR_OPCMDARG,
......
set @old_innodb_file_format_check=@@innodb_file_format_check;
select @old_innodb_file_format_check;
@old_innodb_file_format_check
Antelope
set global innodb_file_format_check = Barracuda;
select @@innodb_file_format_check;
@@innodb_file_format_check
Barracuda
set global innodb_file_format_check = DEFAULT;
select @@innodb_file_format_check;
@@innodb_file_format_check
Barracuda
set global innodb_file_format_check = @old_innodb_file_format_check;
select @@innodb_file_format_check;
@@innodb_file_format_check
Antelope
set global innodb_file_format_check = cheetah;
ERROR HY000: Incorrect arguments to SET
set global innodb_file_format_check = Bear;
ERROR HY000: Incorrect arguments to SET
set global innodb_file_format_check = on;
ERROR HY000: Incorrect arguments to SET
set global innodb_file_format_check = off;
ERROR HY000: Incorrect arguments to SET
# This is the unit test for bug *47167.
# It tests setting the global variable
# "innodb_file_format_check" with a
# user-Defined Variable.
--source include/have_innodb.inc
# Save the value (Antelope) in 'innodb_file_format_check' to
# 'old_innodb_file_format_check'
set @old_innodb_file_format_check=@@innodb_file_format_check;
# @old_innodb_file_format_check shall have the value of 'Antelope'
select @old_innodb_file_format_check;
# Reset the value in 'innodb_file_format_check' to 'Barracuda'
set global innodb_file_format_check = Barracuda;
select @@innodb_file_format_check;
# Set 'innodb_file_format_check' to its default value, which
# is the latest file format supported in the current release.
set global innodb_file_format_check = DEFAULT;
select @@innodb_file_format_check;
# Put the saved value back to 'innodb_file_format_check'
set global innodb_file_format_check = @old_innodb_file_format_check;
# Check whether 'innodb_file_format_check' get its original value.
select @@innodb_file_format_check;
# Following are negative tests, all should fail.
--disable_warnings
--error ER_WRONG_ARGUMENTS
set global innodb_file_format_check = cheetah;
--error ER_WRONG_ARGUMENTS
set global innodb_file_format_check = Bear;
--error ER_WRONG_ARGUMENTS
set global innodb_file_format_check = on;
--error ER_WRONG_ARGUMENTS
set global innodb_file_format_check = off;
--enable_warnings
...@@ -30,8 +30,6 @@ select @@innodb_file_format_check; ...@@ -30,8 +30,6 @@ select @@innodb_file_format_check;
@@innodb_file_format_check @@innodb_file_format_check
Barracuda Barracuda
set global innodb_file_format_check=default; set global innodb_file_format_check=default;
Warnings:
Warning 1210 Ignoring SET innodb_file_format=on
select @@innodb_file_format_check; select @@innodb_file_format_check;
@@innodb_file_format_check @@innodb_file_format_check
Barracuda Barracuda
......
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