mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	according to the standard.
The idea is to use Field-classes to implement stored routines
variables. Also, we should provide facade to Item-hierarchy
by Item_field class (it is necessary, since SRVs take part
in expressions).
The patch fixes the following bugs:
  - BUG#8702: Stored Procedures: No Error/Warning shown for inappropriate data 
    type matching; 
 
  - BUG#8768: Functions: For any unsigned data type, -ve values can be passed 
    and returned; 
 
  - BUG#8769: Functions: For Int datatypes, out of range values can be passed 
    and returned; 
 
  - BUG#9078: STORED PROCDURE: Decimal digits are not displayed when we use 
    DECIMAL datatype; 
 
  - BUG#9572: Stored procedures: variable type declarations ignored; 
 
  - BUG#12903: upper function does not work inside a function; 
 
  - BUG#13705: parameters to stored procedures are not verified; 
 
  - BUG#13808: ENUM type stored procedure parameter accepts non-enumerated
    data; 
 
  - BUG#13909: Varchar Stored Procedure Parameter always BINARY string (ignores 
    CHARACTER SET); 
 
  - BUG#14161: Stored procedure cannot retrieve bigint unsigned;
  - BUG#14188: BINARY variables have no 0x00 padding;
  - BUG#15148: Stored procedure variables accept non-scalar values;
mysql-test/r/ctype_ujis.result:
  Explicitly specify correct charset.
mysql-test/r/schema.result:
  Drop our test database to not affect this test if some test
  left it cause of failure.
mysql-test/r/show_check.result:
  Drop our test database to not affect this test if some test
  left it cause of failure.
mysql-test/r/skip_name_resolve.result:
  Ignore columns with unpredictable values.
mysql-test/r/sp-big.result:
  Add cleanup statement.
mysql-test/r/sp-dynamic.result:
  Add cleanup statements.
mysql-test/r/sp.result:
  Update result file.
mysql-test/r/sum_distinct-big.result:
  Update result file.
mysql-test/r/type_newdecimal-big.result:
  Update result file.
mysql-test/t/ctype_ujis.test:
  Explicitly specify correct charset.
mysql-test/t/schema.test:
  Drop our test database to not affect this test if some test
  left it cause of failure.
mysql-test/t/show_check.test:
  Drop our test database to not affect this test if some test
  left it cause of failure.
mysql-test/t/skip_name_resolve.test:
  Ignore columns with unpredictable values.
mysql-test/t/sp-big.test:
  Add cleanup statement.
mysql-test/t/sp-dynamic.test:
  Add cleanup statements.
mysql-test/t/sp.test:
  Non-scalar values prohibited for assignment to SP-vars;
  polishing.
mysql-test/t/type_newdecimal-big.test:
  Update type specification so that the variables
  can contain the large values used in the test.
sql/field.cc:
  Extract create_field::init() to initialize an existing
  instance of create_field from new_create_field().
sql/field.h:
  Extract create_field::init() to initialize an existing
  instance of create_field from new_create_field().
sql/item.cc:
  - Introduce a new class: Item_sp_variable -- a base class
    of stored-routine-variables classes;
  - Introduce Item_case_expr -- an Item, which is used to access
    to the expression of CASE statement;
sql/item.h:
  - Introduce a new class: Item_sp_variable -- a base class
    of stored-routine-variables classes;
  - Introduce Item_case_expr -- an Item, which is used to access
    to the expression of CASE statement;
sql/item_func.cc:
  Pass the Field (instead of Item) for the return value of
  a function to the function execution routine.
sql/item_func.h:
  Pass the Field (instead of Item) for the return value of
  a function to the function execution routine.
sql/mysql_priv.h:
  Move create_virtual_tmp_table() out of sql_select.h.
sql/sp.cc:
  Use create_result_field() instead of make_field().
sql/sp_head.cc:
  - Add a function to map enum_field_types to Item::Type;
  - Add sp_instr_push_case_expr instruction -- an instruction
    to push CASE expression into the active running context;
  - Add sp_instr_pop_case_expr instruction -- an instruction
    to pop CASE expression from the active running context;
  - Adapt the SP-execution code to using Fields instead of Items
    for SP-vars;
  - Use create_field structure for field description instead of
    a set of members.
sql/sp_head.h:
  - Add a function to map enum_field_types to Item::Type;
  - Add sp_instr_push_case_expr instruction -- an instruction
    to push CASE expression into the active running context;
  - Add sp_instr_pop_case_expr instruction -- an instruction
    to pop CASE expression from the active running context;
  - Adapt the SP-execution code to using Fields instead of Items
    for SP-vars;
  - Use create_field structure for field description instead of
    a set of members.
sql/sp_pcontext.cc:
  - Change rules to assign an index of SP-variable: use
    transparent index;
  - Add an operation to retrieve a list of defined SP-vars
    from the processing context recursively.
sql/sp_pcontext.h:
  - Change rules to assign an index of SP-variable: use
    transparent index;
  - Add an operation to retrieve a list of defined SP-vars
    from the processing context recursively.
sql/sp_rcontext.cc:
  - Change rules to assign an index of SP-variable: use
    transparent index;
  - Use a tmp virtual table to store SP-vars instead of Items;
  - Provide operations to work with CASE expresion.
sql/sp_rcontext.h:
  - Change rules to assign an index of SP-variable: use
    transparent index;
  - Use a tmp virtual table to store SP-vars instead of Items;
  - Provide operations to work with CASE expresion.
sql/sql_class.cc:
  - Reflect Item_splocal ctor changes;
  - Item_splocal::get_offset() has been renamed to get_var_idx().
sql/sql_class.h:
  Polishing.
sql/sql_parse.cc:
  Extract create_field::init() to initialize an existing
  instance of create_field from new_create_field().
sql/sql_select.cc:
  Take care of BLOB columns in create_virtual_tmp_table().
sql/sql_select.h:
  Move create_virtual_tmp_table() out of sql_select.h.
sql/sql_trigger.cc:
  Use boolean constants for boolean type instead of numerical ones.
sql/sql_yacc.yy:
  Provide an instance of create_field for each SP-var.
mysql-test/include/sp-vars.inc:
  The definitions of common-procedures, which are created
  under different circumstances.
mysql-test/r/sp-vars.result:
  Result file for the SP-vars test.
mysql-test/sp-vars.test:
  A new test for checking SP-vars functionality.
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#
 | 
						|
# Bug #11602: SP with very large body not handled well
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop procedure if exists test.longprocedure;
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
create table t1 (a int);
 | 
						|
insert into t1 values (1),(2),(3);
 | 
						|
 | 
						|
let $body=`select repeat('select count(*) into out1 from t1;\n', 3072)`;
 | 
						|
 | 
						|
delimiter //;
 | 
						|
--disable_query_log
 | 
						|
eval select length('$body') as length//
 | 
						|
eval create procedure test.longprocedure (out out1 int) deterministic
 | 
						|
begin
 | 
						|
  $body
 | 
						|
end//
 | 
						|
--enable_query_log
 | 
						|
 | 
						|
delimiter ;//
 | 
						|
 | 
						|
# this is larger than the length above, because it includes the 'begin' and
 | 
						|
# 'end' bits and some whitespace
 | 
						|
select length(routine_definition) from information_schema.routines where routine_schema = 'test' and routine_name = 'longprocedure';
 | 
						|
 | 
						|
call test.longprocedure(@value); select @value;
 | 
						|
 | 
						|
drop procedure test.longprocedure;
 | 
						|
drop table t1;
 | 
						|
#
 | 
						|
# Bug #9819 "Cursors: Mysql Server Crash while fetching from table with 5
 | 
						|
# million records.": 
 | 
						|
# To really test the bug, increase the number of loop iterations ($1).
 | 
						|
# For 4 millions set $1 to 22.
 | 
						|
create table t1 (f1 char(100) , f2 mediumint , f3 int , f4 real, f5 numeric);
 | 
						|
insert into t1 (f1, f2, f3, f4, f5) values
 | 
						|
("This is a test case for for Bug#9819", 1, 2, 3.0, 4.598);
 | 
						|
create table t2 like t1;
 | 
						|
let $1=8;
 | 
						|
--disable_query_log
 | 
						|
--disable_result_log
 | 
						|
while ($1)
 | 
						|
{
 | 
						|
  eval insert into t1 select * from t1;
 | 
						|
  dec $1;
 | 
						|
}
 | 
						|
--enable_result_log
 | 
						|
--enable_query_log
 | 
						|
select count(*) from t1;
 | 
						|
select count(*) from t2;
 | 
						|
--disable_warnings
 | 
						|
drop procedure if exists p1;
 | 
						|
--enable_warnings
 | 
						|
delimiter |;
 | 
						|
create procedure p1()
 | 
						|
begin
 | 
						|
  declare done integer default 0;
 | 
						|
  declare vf1 char(100) ;
 | 
						|
  declare vf2 mediumint;
 | 
						|
  declare vf3 int ;
 | 
						|
  declare vf4 real ;
 | 
						|
  declare vf5 numeric ;
 | 
						|
  declare cur1 cursor for select f1,f2,f3,f4,f5 from t1;  
 | 
						|
  declare continue handler for sqlstate '02000' set done = 1; 
 | 
						|
  open cur1;
 | 
						|
  while done <> 1 do
 | 
						|
    fetch cur1 into vf1, vf2, vf3, vf4, vf5;
 | 
						|
    if not done then
 | 
						|
      insert into t2 values (vf1, vf2, vf3, vf4, vf5);
 | 
						|
    end if;
 | 
						|
  end while;
 | 
						|
  close cur1;
 | 
						|
end|
 | 
						|
delimiter ;|
 | 
						|
call p1();
 | 
						|
select count(*) from t1;
 | 
						|
select count(*) from t2;
 | 
						|
select f1 from t1 limit 1;
 | 
						|
select f1 from t2 limit 1;
 | 
						|
drop procedure p1;
 | 
						|
drop table t1, t2;
 |