mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	This allows us to use statement replication with functions and triggers The following things are fixed with this patch: - NOW() and automatic timestamps takes the value from the main event for functions and triggers (which allows these to replicate with statement level logging) - No side effects for triggers or functions with auto-increment values(), last_insert_id(), rand() or found_rows() - Triggers can't return result sets Fixes bugs: #12480: NOW() is not constant in a trigger #12481: Using NOW() in a stored function breaks statement based replication #12482: Triggers has side effects with auto_increment values #11587: trigger causes lost connection error mysql-test/r/trigger.result: Added test fpr big mysql-test/t/sp-error.test: Changed error message numbers mysql-test/t/trigger.test: Added test for trigger returning result (#11587) sql/item_func.cc: Store the first used seed value for RAND() value. (This makes rand() replicatable in functions and triggers) Save and clear run context before executing a stored function and restore it afterwards. This removes side effects of stored functions for RAND(), auto-increment values and NOW() and makes most stored function replicatable sql/share/errmsg.txt: Reuse error message also for triggers sql/sp_head.cc: If in function or trigger, don't change value of NOW() (This allows us to use statement replication with functions that directly or indirectly uses timestamps) sql/sql_class.cc: Added framework for storing and retrieving run context while exceuting triggers or stored functions. sql/sql_class.h: Added framework for storing and retrieving run context while exceuting triggers or stored functions. sql/sql_parse.cc: If in function or trigger, don't change value of NOW() (This allows us to use statement replication with functions that directly or indirectly uses timestamps) sql/sql_trigger.cc: Moved process_triggers function from sql_trigger.h Use reset/restore sub_statement_state while executing triggers to avoid side effects and make them replicatable sql/sql_trigger.h: Moved process_triggers function from sql_trigger.h Use reset/restore sub_statement_state while executing triggers to avoid side effects and make them replicatable sql/sql_yacc.yy: Give error message if trigger can return a result set (Bug #11587) tests/fork_big2.pl: Removed return from end of lines mysql-test/r/rpl_trigger.result: New BitKeeper file ``mysql-test/r/rpl_trigger.result'' mysql-test/t/rpl_trigger.test: New BitKeeper file ``mysql-test/t/rpl_trigger.test''
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| stop slave;
 | |
| drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | |
| reset master;
 | |
| reset slave;
 | |
| drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | |
| start slave;
 | |
| create table t1 (a int auto_increment, primary key (a), b int, rand_value double not null);
 | |
| create table t2 (a int auto_increment, primary key (a), b int);
 | |
| create table t3 (a int auto_increment, primary key (a), name varchar(64) not null, old_a int, old_b int, rand_value double not null);
 | |
| create trigger t1 before insert on t1 for each row
 | |
| begin
 | |
| insert into t3 values (NULL, "t1", new.a, new.b, rand());
 | |
| end|
 | |
| create trigger t2 after insert on t2 for each row
 | |
| begin
 | |
| insert into t3 values (NULL, "t2", new.a, new.b, rand());
 | |
| end|
 | |
| insert into t3 values(100,"log",0,0,0);
 | |
| SET @@RAND_SEED1=658490765, @@RAND_SEED2=635893186;
 | |
| insert into t1 values(1,1,rand()),(NULL,2,rand());
 | |
| insert into t2 (b) values(last_insert_id());
 | |
| insert into t2 values(3,0),(NULL,0);
 | |
| insert into t2 values(NULL,0),(500,0);
 | |
| select a,b, truncate(rand_value,4) from t1;
 | |
| a	b	truncate(rand_value,4)
 | |
| 1	1	0.4320
 | |
| 2	2	0.3055
 | |
| select * from t2;
 | |
| a	b
 | |
| 1	2
 | |
| 3	0
 | |
| 4	0
 | |
| 5	0
 | |
| 500	0
 | |
| select a,name, old_a, old_b, truncate(rand_value,4) from t3;
 | |
| a	name	old_a	old_b	truncate(rand_value,4)
 | |
| 100	log	0	0	0.0000
 | |
| 101	t1	1	1	0.3203
 | |
| 102	t1	0	2	0.5666
 | |
| 103	t2	1	2	0.9164
 | |
| 104	t2	3	0	0.8826
 | |
| 105	t2	4	0	0.6635
 | |
| 106	t2	5	0	0.6699
 | |
| 107	t2	500	0	0.3593
 | |
| 
 | |
| --- On slave --
 | |
| select a,b, truncate(rand_value,4) from t1;
 | |
| a	b	truncate(rand_value,4)
 | |
| 1	1	0.4320
 | |
| 2	2	0.3055
 | |
| select * from t2;
 | |
| a	b
 | |
| 1	2
 | |
| 3	0
 | |
| 4	0
 | |
| 5	0
 | |
| 500	0
 | |
| select a,name, old_a, old_b, truncate(rand_value,4) from t3;
 | |
| a	name	old_a	old_b	truncate(rand_value,4)
 | |
| 100	log	0	0	0.0000
 | |
| 101	t1	1	1	0.3203
 | |
| 102	t1	0	2	0.5666
 | |
| 103	t2	1	2	0.9164
 | |
| 104	t2	3	0	0.8826
 | |
| 105	t2	4	0	0.6635
 | |
| 106	t2	5	0	0.6699
 | |
| 107	t2	500	0	0.3593
 | |
| drop table t1,t2,t3;
 | |
| select get_lock("bug12480",2);
 | |
| get_lock("bug12480",2)
 | |
| 1
 | |
| create table t1 (a datetime,b  datetime, c datetime);
 | |
| drop function if exists bug12480;
 | |
| Warnings:
 | |
| Note	1305	FUNCTION bug12480 does not exist
 | |
| create function bug12480() returns datetime
 | |
| begin
 | |
| set @a=get_lock("bug12480",2);
 | |
| return now();
 | |
| end|
 | |
| create trigger t1_first before insert on t1
 | |
| for each row begin
 | |
| set @a=get_lock("bug12480",2);
 | |
| set new.b= now();
 | |
| set new.c= bug12480();
 | |
| end
 | |
| |
 | |
| insert into t1 set a = now();
 | |
| select a=b && a=c from t1;
 | |
| a=b && a=c
 | |
| 1
 | |
| 
 | |
| --- On slave --
 | |
| select a=b && a=c from t1;
 | |
| a=b && a=c
 | |
| 1
 | |
| test
 | |
| 1
 | |
| truncate table t1;
 | |
| drop trigger t1_first;
 | |
| insert into t1 values ("2003-03-03","2003-03-03","2003-03-03"),(bug12480(),bug12480(),bug12480()),(now(),now(),now());
 | |
| select a=b && a=c from t1;
 | |
| a=b && a=c
 | |
| 1
 | |
| 1
 | |
| 1
 | |
| drop function bug12480;
 | |
| drop table t1;
 |