Commit e13b28af authored by Neeraj Bisht's avatar Neeraj Bisht

Bug#17075846 - UNQUOTED FILE NAMES FOR VARIABLE VALUES ARE

	       ACCEPTED BUT PARSED INCORRECTLY

When we are setting the value in a system variable, 
We can set it like 

set sys_var="Iden1.Iden2";		//1
set sys_var='Iden1.Iden2';		//2
set sys_var=Iden1.Iden2;		//3
set sys_var=.ident1.ident2; 		//4
set sys_var=`Iden1.Iden2`;		//5


While parsing, for case 1(when ANSI_QUOTES is enable) and 2,
we will take as string literal(we will make item of type Item_string).
for case 3 & 4, taken as Item_field, where Iden1 is a table name and
iden2 is a field name.
for case 5, again Item_field type, where iden1.iden2 is taken as
field name.


Now in case 1, when we are assigning some value to system variable
(which can take string or enumerate type data), we are setting only 
field part.
This means only iden2 value will be set for system variable. This 
result in wrong result.

Solution:

(for string type) We need to Document that we are not allowed to set 
system variable which takes string as identifier, otherwise result 
in unexpected behaviour.

(for enumerate type)
if we pass iden1.iden2, we will give an error ER_WRONG_TYPE_FOR_VAR
(Incorrect argument type to variable).

mysql-test/suite/sys_vars/t/general_log_file_basic.test:
  Earlier we used to give ER_WRONG_VALUE_FOR_VAR error, but in the patch of
  (Bug32748-Inconsistent handling of assignments to general_log_file/slow_query_log_file)
  they quoted this line.But i am not able to find any relation of this with the changes of
  patch. So i think We should give error in this case.
mysql-test/suite/sys_vars/t/slow_query_log_file_basic.test:
  Earlier we used to give ER_WRONG_VALUE_FOR_VAR error, but in the patch of
  (Bug32748-Inconsistent handling of assignments to general_log_file/slow_query_log_file)
  they quoted this line.But i am not able to find any relation of this with the changes of
  patch. So i think We should give error in this case.
parent cebe93dc
...@@ -622,3 +622,28 @@ DROP TABLE t1, t2, t3; ...@@ -622,3 +622,28 @@ DROP TABLE t1, t2, t3;
# #
# End of 5.1 tests # End of 5.1 tests
# #
#
# Bug#17075846 : unquoted file names for variable values are
# accepted but parsed incorrectly
#
SET default_storage_engine=a.myisam;
ERROR 42000: Incorrect argument type to variable 'default_storage_engine'
SET default_storage_engine = .a.MyISAM;
ERROR 42000: Incorrect argument type to variable 'default_storage_engine'
SET default_storage_engine = a.b.MyISAM;
ERROR 42000: Incorrect argument type to variable 'default_storage_engine'
SET default_storage_engine = `a`.MyISAM;
ERROR 42000: Incorrect argument type to variable 'default_storage_engine'
SET default_storage_engine = `a`.`MyISAM`;
ERROR 42000: Incorrect argument type to variable 'default_storage_engine'
set default_storage_engine = "a.MYISAM";
ERROR 42000: Unknown storage engine 'a.MYISAM'
set default_storage_engine = 'a.MYISAM';
ERROR 42000: Unknown storage engine 'a.MYISAM'
set default_storage_engine = `a.MYISAM`;
ERROR 42000: Unknown storage engine 'a.MYISAM'
CREATE TABLE t1 (s VARCHAR(100));
CREATE TRIGGER trigger1 BEFORE INSERT ON t1 FOR EACH ROW
SET default_storage_engine = NEW.INNODB;
ERROR 42S22: Unknown column 'INNODB' in 'NEW'
DROP TABLE t1;
...@@ -10,6 +10,7 @@ RIGHT(@@global.general_log_file, length(@a)) = @a ...@@ -10,6 +10,7 @@ RIGHT(@@global.general_log_file, length(@a)) = @a
1 1
'#--------------------FN_DYNVARS_004_02------------------------#' '#--------------------FN_DYNVARS_004_02------------------------#'
SET @@global.general_log_file = mytest.log; SET @@global.general_log_file = mytest.log;
ERROR 42000: Incorrect argument type to variable 'general_log_file'
SET @@global.general_log_file = 12; SET @@global.general_log_file = 12;
ERROR 42000: Incorrect argument type to variable 'general_log_file' ERROR 42000: Incorrect argument type to variable 'general_log_file'
'#----------------------FN_DYNVARS_004_03------------------------#' '#----------------------FN_DYNVARS_004_03------------------------#'
......
...@@ -7,6 +7,7 @@ RIGHT(@@global.slow_query_log_file, length(@a)) = @a ...@@ -7,6 +7,7 @@ RIGHT(@@global.slow_query_log_file, length(@a)) = @a
1 1
'#--------------------FN_DYNVARS_004_02------------------------#' '#--------------------FN_DYNVARS_004_02------------------------#'
SET @@global.slow_query_log_file = mytest.log; SET @@global.slow_query_log_file = mytest.log;
ERROR 42000: Incorrect argument type to variable 'slow_query_log_file'
SET @@global.slow_query_log_file = 12; SET @@global.slow_query_log_file = 12;
ERROR 42000: Incorrect argument type to variable 'slow_query_log_file' ERROR 42000: Incorrect argument type to variable 'slow_query_log_file'
'#----------------------FN_DYNVARS_004_03------------------------#' '#----------------------FN_DYNVARS_004_03------------------------#'
......
...@@ -54,7 +54,7 @@ SELECT RIGHT(@@global.general_log_file, length(@a)) = @a; ...@@ -54,7 +54,7 @@ SELECT RIGHT(@@global.general_log_file, length(@a)) = @a;
# Change the value of general_log_file to a invalid value # # Change the value of general_log_file to a invalid value #
####################################################################### #######################################################################
# Assumed text if no quotes or numbers. --error ER_WRONG_TYPE_FOR_VAR
SET @@global.general_log_file = mytest.log; SET @@global.general_log_file = mytest.log;
--error ER_WRONG_TYPE_FOR_VAR --error ER_WRONG_TYPE_FOR_VAR
SET @@global.general_log_file = 12; SET @@global.general_log_file = 12;
......
...@@ -52,7 +52,7 @@ SELECT RIGHT(@@global.slow_query_log_file, length(@a)) = @a; ...@@ -52,7 +52,7 @@ SELECT RIGHT(@@global.slow_query_log_file, length(@a)) = @a;
# Change the value of slow_query_log_file to a invalid value # # Change the value of slow_query_log_file to a invalid value #
####################################################################### #######################################################################
# Assumed text if no quotes or numbers. --error ER_WRONG_TYPE_FOR_VAR
SET @@global.slow_query_log_file = mytest.log; SET @@global.slow_query_log_file = mytest.log;
--error ER_WRONG_TYPE_FOR_VAR --error ER_WRONG_TYPE_FOR_VAR
SET @@global.slow_query_log_file = 12; SET @@global.slow_query_log_file = 12;
......
...@@ -733,3 +733,28 @@ DROP TABLE t1, t2, t3; ...@@ -733,3 +733,28 @@ DROP TABLE t1, t2, t3;
--echo # End of 5.1 tests --echo # End of 5.1 tests
--echo # --echo #
--echo #
--echo # Bug#17075846 : unquoted file names for variable values are
--echo # accepted but parsed incorrectly
--echo #
--error ER_WRONG_TYPE_FOR_VAR
SET default_storage_engine=a.myisam;
--error ER_WRONG_TYPE_FOR_VAR
SET default_storage_engine = .a.MyISAM;
--error ER_WRONG_TYPE_FOR_VAR
SET default_storage_engine = a.b.MyISAM;
--error ER_WRONG_TYPE_FOR_VAR
SET default_storage_engine = `a`.MyISAM;
--error ER_WRONG_TYPE_FOR_VAR
SET default_storage_engine = `a`.`MyISAM`;
--error ER_UNKNOWN_STORAGE_ENGINE
set default_storage_engine = "a.MYISAM";
--error ER_UNKNOWN_STORAGE_ENGINE
set default_storage_engine = 'a.MYISAM';
--error ER_UNKNOWN_STORAGE_ENGINE
set default_storage_engine = `a.MYISAM`;
CREATE TABLE t1 (s VARCHAR(100));
--ERROR ER_BAD_FIELD_ERROR
CREATE TRIGGER trigger1 BEFORE INSERT ON t1 FOR EACH ROW
SET default_storage_engine = NEW.INNODB;
DROP TABLE t1;
/* /*
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -444,6 +444,13 @@ set_system_variable(THD *thd, struct sys_var_with_base *tmp, ...@@ -444,6 +444,13 @@ set_system_variable(THD *thd, struct sys_var_with_base *tmp,
if (lex->spcont && tmp->var == Sys_autocommit_ptr) if (lex->spcont && tmp->var == Sys_autocommit_ptr)
lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
if (val && val->type() == Item::FIELD_ITEM &&
((Item_field*)val)->table_name)
{
my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), tmp->var->name.str);
return TRUE;
}
if (! (var= new set_var(var_type, tmp->var, &tmp->base_name, val))) if (! (var= new set_var(var_type, tmp->var, &tmp->base_name, val)))
return TRUE; return TRUE;
......
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