mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-25 18:38:00 +03:00 
			
		
		
		
	******
This patch fixes the following bugs:
  - Bug#5889: Exit handler for a warning doesn't hide the warning in
    trigger
  - Bug#9857: Stored procedures: handler for sqlwarning ignored
  - Bug#23032: Handlers declared in a SP do not handle warnings generated
    in sub-SP
  - Bug#36185: Incorrect precedence for warning and exception handlers
The problem was in the way warnings/errors during stored routine execution
were handled. Prior to this patch the logic was as follows:
  - when a warning/an error happens: if we're executing a stored routine,
    and there is a handler for that warning/error, remember the handler,
    ignore the warning/error and continue execution.
  - after a stored routine instruction is executed: check for a remembered
    handler and activate one (if any).
This logic caused several problems:
  - if one instruction generates several warnings (errors) it's impossible
    to choose the right handler -- a handler for the first generated
    condition was chosen and remembered for activation.
  - mess with handling conditions in scopes different from the current one.
  - not putting generated warnings/errors into Warning Info (Diagnostic
    Area) is against The Standard.
The patch changes the logic as follows:
  - Diagnostic Area is cleared on the beginning of each statement that
    either is able to generate warnings, or is able to work with tables.
  - at the end of a stored routine instruction, Diagnostic Area is left
    intact.
  - Diagnostic Area is checked after each stored routine instruction. If
    an instruction generates several condition, it's now possible to take a
    look at all of them and determine an appropriate handler.
mysql-test/r/signal.result:
  Update result file:
    1. handled conditions are not cleared any more;
    2. reflect changes in signal.test
mysql-test/r/signal_demo3.result:
  Update result file: handled conditions are not cleared any more.
  Due to playing with max_error_count, resulting warning lists
  have changed.
mysql-test/r/sp-big.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-bugs.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/r/sp-code.result:
  Update result file:
    1. handled conditions are not cleared any more.
    2. add result for a new test case in sp-code.test.
mysql-test/r/sp-error.result:
  Update result file:
    1. handled conditions are not cleared any more.
    2. add result for a new test case in sp-error.test.
mysql-test/r/sp.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/r/sp_trans.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/r/strict.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/r/view.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/innodb_storedproc_02.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/memory_storedproc_02.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/myisam_storedproc_02.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/funcs_1/r/storedproc.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp005.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/suite/rpl/r/rpl_row_trig003.result:
  Update result file: handled conditions are not cleared any more.
mysql-test/t/signal.test:
  Make a test case more readable in the result file.
mysql-test/t/sp-code.test:
  Add a test case for Bug#23032 checking that
  No Data takes precedence on Warning.
mysql-test/t/sp-error.test:
  Adding test cases for:
    - Bug#23032
    - Bug#36185
    - Bug#5889
    - Bug#9857
mysql-test/t/sp.test:
  Fixing test case to reflect behavioral changes made by the patch.
sql/sp_head.cc:
  Reset the per-statement warning count before executing
  a stored procedure instruction.
  
  Move to a separate function code which checks the
  completion status of the executed statement and searches
  for a handler.
  
  Remove redundant code now that search for a handler is
  done after execution, errors are always pushed.
sql/sp_pcontext.h:
  Remove unused code.
sql/sp_rcontext.cc:
  - Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead
    of an extra local variable;
  
  - Remove sp_rcontext::handle_condition();
  
  - Introduce sp_rcontext::activate_handler(), which prepares
    previously found handler for execution.
  
  - Move sp_rcontext::enter_handler() code into activate_handler(),
    because enter_handler() is used only from there;
  
  - Cleanups;
  
  - Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test
sql/sp_rcontext.h:
  - Remove unused code
  - Cleanups
sql/sql_class.cc:
  Merge THD::raise_condition_no_handler() into THD::raise_condition().
  After the patch raise_condition_no_handler() was called
  in raise_condition() only.
sql/sql_class.h:
  Remove raise_condition_no_handler().
sql/sql_error.cc:
  Remove Warning_info::reserve_space() -- handled conditions are not
  cleared any more, so there is no need for RESIGNAL to re-push them.
sql/sql_error.h:
  Remove Warning_info::reserve_space().
sql/sql_signal.cc:
  Handled conditions are not cleared any more,
  so there is no need for RESIGNAL to re-push them.
		
	
		
			
				
	
	
		
			588 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			588 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| drop table if exists t1, t2, t3;
 | |
| drop procedure if exists bug8850|
 | |
| create table t1 (a int) engine=innodb|
 | |
| create procedure bug8850()
 | |
| begin
 | |
| truncate table t1; insert t1 values (1); rollback;
 | |
| end|
 | |
| set autocommit=0|
 | |
| insert t1 values (2)|
 | |
| call bug8850()|
 | |
| commit|
 | |
| select * from t1|
 | |
| a
 | |
| call bug8850()|
 | |
| set autocommit=1|
 | |
| select * from t1|
 | |
| a
 | |
| drop table t1|
 | |
| drop procedure bug8850|
 | |
| drop function if exists bug10015_1|
 | |
| drop function if exists bug10015_2|
 | |
| drop function if exists bug10015_3|
 | |
| drop function if exists bug10015_4|
 | |
| drop function if exists bug10015_5|
 | |
| drop function if exists bug10015_6|
 | |
| drop function if exists bug10015_7|
 | |
| drop procedure if exists bug10015_8|
 | |
| create table t1 (id int) engine=innodb|
 | |
| create table t2 (id int primary key, j int) engine=innodb|
 | |
| insert into t1 values (1),(2),(3)|
 | |
| create function bug10015_1() returns int return (select count(*) from t1)|
 | |
| select *, bug10015_1() from t1|
 | |
| id	bug10015_1()
 | |
| 1	3
 | |
| 2	3
 | |
| 3	3
 | |
| drop function bug10015_1|
 | |
| create function bug10015_2() returns int 
 | |
| begin
 | |
| declare i, s int;
 | |
| set i:= (select min(id) from t1);
 | |
| set s:= (select max(id) from t1);
 | |
| return (s - i);
 | |
| end|
 | |
| select *, bug10015_2() from t1|
 | |
| id	bug10015_2()
 | |
| 1	2
 | |
| 2	2
 | |
| 3	2
 | |
| drop function bug10015_2|
 | |
| create function bug10015_3() returns int 
 | |
| return (select max(a.id - b.id) from t1 as a, t1 as b where a.id >= b.id)|
 | |
| select *, bug10015_3() from t1|
 | |
| id	bug10015_3()
 | |
| 1	2
 | |
| 2	2
 | |
| 3	2
 | |
| drop function bug10015_3|
 | |
| create function bug10015_4(i int) returns int 
 | |
| begin
 | |
| declare m int;
 | |
| set m:= (select max(id) from t2);
 | |
| insert into t2 values (i, m);
 | |
| return m;
 | |
| end|
 | |
| select *, bug10015_4(id) from t1|
 | |
| id	bug10015_4(id)
 | |
| 1	NULL
 | |
| 2	1
 | |
| 3	2
 | |
| select * from t2|
 | |
| id	j
 | |
| 1	NULL
 | |
| 2	1
 | |
| 3	2
 | |
| drop function bug10015_4|
 | |
| create function bug10015_5(i int) returns int
 | |
| begin
 | |
| if (i = 5) then
 | |
| insert into t2 values (1, 0);
 | |
| end if;
 | |
| return i;
 | |
| end|
 | |
| insert into t1 values (bug10015_5(4)), (bug10015_5(5))|
 | |
| ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
 | |
| select * from t1|
 | |
| id
 | |
| 1
 | |
| 2
 | |
| 3
 | |
| drop function bug10015_5|
 | |
| create function bug10015_6(i int) returns int
 | |
| begin
 | |
| declare continue handler for sqlexception set @error_in_func:= 1;
 | |
| if (i = 5) then
 | |
| insert into t2 values (4, 0), (1, 0);
 | |
| end if;
 | |
| return i;
 | |
| end|
 | |
| set @error_in_func:= 0|
 | |
| insert into t1 values (bug10015_6(5)), (bug10015_6(6))|
 | |
| Warnings:
 | |
| Error	1062	Duplicate entry '1' for key 'PRIMARY'
 | |
| select @error_in_func|
 | |
| @error_in_func
 | |
| 1
 | |
| select * from t1|
 | |
| id
 | |
| 1
 | |
| 2
 | |
| 3
 | |
| 5
 | |
| 6
 | |
| select * from t2|
 | |
| id	j
 | |
| 1	NULL
 | |
| 2	1
 | |
| 3	2
 | |
| 4	0
 | |
| drop function bug10015_6|
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| alter table t1 add k int;
 | |
| return 1;
 | |
| end|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| start transaction;
 | |
| return 1;
 | |
| end|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| drop table t1;
 | |
| return 1;
 | |
| end|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| drop temporary table t1;
 | |
| return 1;
 | |
| end|
 | |
| drop function bug10015_7|
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| commit;
 | |
| return 1;
 | |
| end|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| create function bug10015_7() returns int
 | |
| begin
 | |
| call bug10015_8();
 | |
| return 1;
 | |
| end|
 | |
| create procedure bug10015_8() alter table t1 add k int|
 | |
| select *, bug10015_7() from t1|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| drop procedure bug10015_8|
 | |
| create procedure bug10015_8() start transaction|
 | |
| select *, bug10015_7() from t1|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| drop procedure bug10015_8|
 | |
| create procedure bug10015_8() drop temporary table if exists t1_temp|
 | |
| select *, bug10015_7() from t1|
 | |
| id	bug10015_7()
 | |
| 1	1
 | |
| 2	1
 | |
| 3	1
 | |
| 5	1
 | |
| 6	1
 | |
| drop procedure bug10015_8|
 | |
| create procedure bug10015_8() commit|
 | |
| select *, bug10015_7() from t1|
 | |
| ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
 | |
| drop procedure bug10015_8|
 | |
| drop function bug10015_7|
 | |
| drop table t1, t2|
 | |
| drop function if exists bug13825_0|
 | |
| drop function if exists bug13825_1|
 | |
| drop function if exists bug13825_2|
 | |
| drop function if exists bug13825_3|
 | |
| drop function if exists bug13825_4|
 | |
| drop function if exists bug13825_5|
 | |
| drop procedure if exists bug13825_0|
 | |
| drop procedure if exists bug13825_1|
 | |
| drop procedure if exists bug13825_2|
 | |
| drop table if exists t1|
 | |
| create table t1 (i int) engine=innodb|
 | |
| create table t2 (i int) engine=innodb|
 | |
| create function bug13825_0() returns int
 | |
| begin
 | |
| rollback to savepoint x;
 | |
| return 1;
 | |
| end|
 | |
| create function bug13825_1() returns int
 | |
| begin
 | |
| release savepoint x;
 | |
| return 1;
 | |
| end|
 | |
| create function bug13825_2() returns int
 | |
| begin
 | |
| insert into t1 values (2);
 | |
| savepoint x;
 | |
| insert into t1 values (3);
 | |
| rollback to savepoint x;
 | |
| insert into t1 values (4);
 | |
| return 1;
 | |
| end|
 | |
| create procedure bug13825_0()
 | |
| begin
 | |
| rollback to savepoint x;
 | |
| end|
 | |
| create procedure bug13825_1()
 | |
| begin
 | |
| release savepoint x;
 | |
| end|
 | |
| create procedure bug13825_2()
 | |
| begin
 | |
| savepoint x;
 | |
| end|
 | |
| insert into t2 values (1)|
 | |
| create trigger t2_bi before insert on t2 for each row
 | |
| rollback to savepoint x|
 | |
| create trigger t2_bu before update on t2 for each row
 | |
| release savepoint x|
 | |
| create trigger t2_bd before delete on t2 for each row
 | |
| begin
 | |
| insert into t1 values (2);
 | |
| savepoint x;
 | |
| insert into t1 values (3);
 | |
| rollback to savepoint x;
 | |
| insert into t1 values (4);
 | |
| end|
 | |
| create function bug13825_3(rb int) returns int
 | |
| begin
 | |
| insert into t1 values(1);
 | |
| savepoint x;
 | |
| insert into t1 values(2);
 | |
| if rb then
 | |
| rollback to savepoint x;
 | |
| end if;
 | |
| insert into t1 values(3);
 | |
| return rb;
 | |
| end|
 | |
| create function bug13825_4() returns int
 | |
| begin
 | |
| savepoint x;
 | |
| insert into t1 values(2);
 | |
| rollback to savepoint x;
 | |
| return 0;
 | |
| end|
 | |
| create function bug13825_5(p int) returns int
 | |
| begin
 | |
| savepoint x;
 | |
| insert into t2 values(p);
 | |
| rollback to savepoint x;
 | |
| insert into t2 values(p+1);
 | |
| return p;
 | |
| end|
 | |
| set autocommit= 0|
 | |
| begin |
 | |
| insert into t1 values (1)|
 | |
| savepoint x|
 | |
| set @a:= bug13825_0()|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| insert into t2 values (2)|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| set @a:= bug13825_1()|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| update t2 set i = 2|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| set @a:= bug13825_2()|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 2
 | |
| 4
 | |
| rollback to savepoint x|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| delete from t2|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 2
 | |
| 4
 | |
| rollback to savepoint x|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| release savepoint x|
 | |
| set @a:= bug13825_2()|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 2
 | |
| 4
 | |
| rollback to savepoint x|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| delete from t1|
 | |
| commit|
 | |
| begin|
 | |
| insert into t1 values (5)|
 | |
| savepoint x|
 | |
| insert into t1 values (6)|
 | |
| call bug13825_0()|
 | |
| select * from t1|
 | |
| i
 | |
| 5
 | |
| call bug13825_1()|
 | |
| rollback to savepoint x|
 | |
| ERROR 42000: SAVEPOINT x does not exist
 | |
| savepoint x|
 | |
| insert into t1 values (7)|
 | |
| call bug13825_2()|
 | |
| rollback to savepoint x|
 | |
| select * from t1|
 | |
| i
 | |
| 5
 | |
| 7
 | |
| delete from t1|
 | |
| commit|
 | |
| set autocommit= 1|
 | |
| select bug13825_3(0)|
 | |
| bug13825_3(0)
 | |
| 0
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 2
 | |
| 3
 | |
| delete from t1|
 | |
| select bug13825_3(1)|
 | |
| bug13825_3(1)
 | |
| 1
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 3
 | |
| delete from t1|
 | |
| set autocommit= 0|
 | |
| begin|
 | |
| insert into t1 values (1)|
 | |
| set @a:= bug13825_4()|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| delete from t1|
 | |
| commit|
 | |
| set autocommit= 1|
 | |
| drop table t2|
 | |
| create table t2 (i int) engine=innodb|
 | |
| insert into t1 values (1), (bug13825_5(2)), (3)|
 | |
| select * from t1|
 | |
| i
 | |
| 1
 | |
| 2
 | |
| 3
 | |
| select * from t2|
 | |
| i
 | |
| 3
 | |
| drop function bug13825_0|
 | |
| drop function bug13825_1|
 | |
| drop function bug13825_2|
 | |
| drop function bug13825_3|
 | |
| drop function bug13825_4|
 | |
| drop function bug13825_5|
 | |
| drop procedure bug13825_0|
 | |
| drop procedure bug13825_1|
 | |
| drop procedure bug13825_2|
 | |
| drop table t1, t2|
 | |
| drop table if exists t3|
 | |
| drop procedure if exists bug14840_1|
 | |
| drop procedure if exists bug14840_2|
 | |
| create table t3
 | |
| (
 | |
| x int,
 | |
| y int,
 | |
| primary key (x)
 | |
| ) engine=InnoDB|
 | |
| create procedure bug14840_1()
 | |
| begin
 | |
| declare err int default 0;
 | |
| declare continue handler for sqlexception
 | |
| set err = err + 1;
 | |
| start transaction;
 | |
| update t3 set x = 1, y = 42 where x = 2;
 | |
| insert into t3 values (3, 4711);
 | |
| if err > 0 then
 | |
| rollback;
 | |
| else
 | |
| commit;
 | |
| end if;
 | |
| select * from t3;
 | |
| end|
 | |
| create procedure bug14840_2()
 | |
| begin
 | |
| declare err int default 0;
 | |
| declare continue handler for sqlexception
 | |
| begin
 | |
| set err = err + 1;
 | |
| select err as 'Ping';
 | |
| end;
 | |
| update t3 set x = 1, y = 42 where x = 2;
 | |
| update t3 set x = 1, y = 42 where x = 2;
 | |
| insert into t3 values (3, 4711);
 | |
| select * from t3;
 | |
| end|
 | |
| insert into t3 values (1, 3), (2, 5)|
 | |
| call bug14840_1()|
 | |
| x	y
 | |
| 1	3
 | |
| 2	5
 | |
| delete from t3|
 | |
| insert into t3 values (1, 3), (2, 5)|
 | |
| call bug14840_2()|
 | |
| Ping
 | |
| 1
 | |
| Ping
 | |
| 2
 | |
| x	y
 | |
| 1	3
 | |
| 2	5
 | |
| 3	4711
 | |
| drop procedure bug14840_1|
 | |
| drop procedure bug14840_2|
 | |
| drop table t3|
 | |
| drop procedure if exists bug10656_create_index|
 | |
| drop procedure if exists bug10656_myjoin|
 | |
| drop procedure if exists bug10656_truncate_table|
 | |
| CREATE TABLE t3 (
 | |
| `ID` int(11) default NULL,
 | |
| `txt` char(5) default NULL
 | |
| ) ENGINE=InnoDB DEFAULT CHARSET=latin1|
 | |
| INSERT INTO t3 (`ID`,`txt`) VALUES
 | |
| (1,'a'), (2,'b'), (3,'c'), (4,'d')|
 | |
| CREATE TABLE t4 (
 | |
| `ID` int(11) default NULL,
 | |
| `txt` char(5) default NULL
 | |
| ) ENGINE=InnoDB DEFAULT CHARSET=latin1|
 | |
| INSERT INTO t4 (`ID`,`txt`) VALUES
 | |
| (1,'a'), (2,'b'), (3,'c'), (4,'d')|
 | |
| create procedure bug10656_create_index()
 | |
| begin
 | |
| create index bug10656_my_index on t3 (ID);
 | |
| end|
 | |
| call bug10656_create_index()|
 | |
| create procedure bug10656_myjoin()
 | |
| begin
 | |
| update t3, t4 set t3.txt = t4.txt where t3.id = t4.id;
 | |
| end|
 | |
| call bug10656_myjoin()|
 | |
| create procedure bug10656_truncate_table()
 | |
| begin
 | |
| truncate table t3;
 | |
| end|
 | |
| call bug10656_truncate_table()|
 | |
| drop procedure bug10656_create_index|
 | |
| drop procedure bug10656_myjoin|
 | |
| drop procedure bug10656_truncate_table|
 | |
| drop table t3, t4|
 | |
| create table t3 (
 | |
| a int primary key,
 | |
| ach char(1)
 | |
| ) engine = innodb|
 | |
| create table t4 (
 | |
| b int  primary key,
 | |
| bch char(1)
 | |
| ) engine = innodb|
 | |
| insert into t3 values (1 , 'aCh1' ) , ('2' , 'aCh2')|
 | |
| Warnings:
 | |
| Warning	1265	Data truncated for column 'ach' at row 1
 | |
| Warning	1265	Data truncated for column 'ach' at row 2
 | |
| insert into t4 values (1 , 'bCh1' )|
 | |
| Warnings:
 | |
| Warning	1265	Data truncated for column 'bch' at row 1
 | |
| drop procedure if exists bug3448|
 | |
| create procedure bug3448()
 | |
| select * from t3 inner join t4 on t3.a = t4.b|
 | |
| select * from t3 inner join t4 on t3.a = t4.b|
 | |
| a	ach	b	bch
 | |
| 1	a	1	b
 | |
| call bug3448()|
 | |
| a	ach	b	bch
 | |
| 1	a	1	b
 | |
| call bug3448()|
 | |
| a	ach	b	bch
 | |
| 1	a	1	b
 | |
| drop procedure bug3448|
 | |
| drop table t3, t4|
 | |
| drop procedure if exists bug14210|
 | |
| set @@session.max_heap_table_size=16384|
 | |
| select @@session.max_heap_table_size|
 | |
| @@session.max_heap_table_size
 | |
| 16384
 | |
| create table t3 (a char(255)) engine=InnoDB|
 | |
| create procedure bug14210_fill_table()
 | |
| begin
 | |
| declare table_size, max_table_size int default 0;
 | |
| select @@session.max_heap_table_size into max_table_size;
 | |
| delete from t3;
 | |
| insert into t3 (a) values (repeat('a', 255));
 | |
| repeat
 | |
| insert into t3 select a from t3;
 | |
| select count(*)*255 from t3 into table_size;
 | |
| until table_size > max_table_size*2 end repeat;
 | |
| end|
 | |
| call bug14210_fill_table()|
 | |
| drop procedure bug14210_fill_table|
 | |
| create table t4 like t3|
 | |
| create procedure bug14210()
 | |
| begin
 | |
| declare a char(255);
 | |
| declare done int default 0;
 | |
| declare c cursor for select * from t3;
 | |
| declare continue handler for sqlstate '02000' set done = 1;
 | |
| open c;
 | |
| repeat
 | |
| fetch c into a;
 | |
| if not done then
 | |
| insert into t4 values (upper(a));
 | |
| end if;
 | |
| until done end repeat;
 | |
| close c;
 | |
| end|
 | |
| call bug14210()|
 | |
| Warnings:
 | |
| Error	1329	No data - zero rows fetched, selected, or processed
 | |
| select count(*) from t4|
 | |
| count(*)
 | |
| 256
 | |
| drop table t3, t4|
 | |
| drop procedure bug14210|
 | |
| set @@session.max_heap_table_size=default|
 | |
| CREATE DATABASE db_bug7787|
 | |
| use db_bug7787|
 | |
| CREATE PROCEDURE p1()
 | |
| SHOW ENGINE INNODB STATUS; |
 | |
| GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost|
 | |
| DROP DATABASE db_bug7787|
 | |
| drop user user_bug7787@localhost|
 | |
| use test|
 | |
| create table t3 (f1 int, f2 varchar(3), primary key(f1)) engine=innodb|
 | |
| insert into t3 values (1,'aaa'),(2,'bbb'),(3,'ccc')|
 | |
| CREATE FUNCTION bug13575 ( p1 integer ) 
 | |
| returns varchar(3) 
 | |
| BEGIN 
 | |
| DECLARE v1 VARCHAR(10) DEFAULT null;
 | |
| SELECT f2 INTO v1 FROM t3 WHERE f1 = p1; 
 | |
| RETURN v1;
 | |
| END|
 | |
| select distinct f1, bug13575(f1) from t3 order by f1|
 | |
| f1	bug13575(f1)
 | |
| 1	aaa
 | |
| 2	bbb
 | |
| 3	ccc
 | |
| drop function bug13575|
 | |
| drop table t3|
 | |
| #
 | |
| # End of 5.1 tests
 | |
| #
 | |
| # 
 | |
| # Bug #35877 Update .. WHERE with function, constraint violation, crash 
 | |
| #           
 | |
| DROP TABLE IF EXISTS t1_aux|
 | |
| DROP TABLE IF EXISTS t1_not_null|
 | |
| DROP FUNCTION IF EXISTS f1_two_inserts|
 | |
| # MyISAM test
 | |
| CREATE TABLE t1_not_null (f1 BIGINT, f2 BIGINT NOT NULL)|
 | |
| CREATE TABLE t1_aux (f1 BIGINT, f2 BIGINT)|
 | |
| INSERT INTO t1_aux VALUES (1,1)|
 | |
| CREATE FUNCTION f1_two_inserts() returns INTEGER
 | |
| BEGIN
 | |
| INSERT INTO t1_not_null SET f1 = 10, f2 = NULL;
 | |
| RETURN 1;
 | |
| END|
 | |
| UPDATE t1_aux SET f2 = 2 WHERE f1 = f1_two_inserts()|
 | |
| ERROR 23000: Column 'f2' cannot be null
 | |
| # InnoDB test
 | |
| ALTER TABLE t1_not_null ENGINE = InnoDB|
 | |
| ALTER TABLE t1_aux ENGINE = InnoDB|
 | |
| UPDATE t1_aux SET f2 = 2 WHERE f1 = f1_two_inserts()|
 | |
| ERROR 23000: Column 'f2' cannot be null
 | |
| DROP TABLE t1_aux, t1_not_null|
 | |
| DROP FUNCTION f1_two_inserts|
 |