190 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
| 
								 | 
							
								#####################################################################
							 | 
						||
| 
								 | 
							
								# Author: Chuck Bell                                                #
							 | 
						||
| 
								 | 
							
								# Date: 2006-12-21                                                  #
							 | 
						||
| 
								 | 
							
								# Purpose: To test that UDFs are replicated in both row based and   #
							 | 
						||
| 
								 | 
							
								# statement based format. This tests work completed in WL#3629.     #
							 | 
						||
| 
								 | 
							
								#                                                                   #
							 | 
						||
| 
								 | 
							
								# This test is designed to exercise two of the three types of UDFs: #
							 | 
						||
| 
								 | 
							
								# 1) UDFs via loadable libraries, and 2) UDFs with a SQL body.      #
							 | 
						||
| 
								 | 
							
								#####################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--source include/have_udf.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# To run this tests the "sql/udf_example.c" need to be compiled into
							 | 
						||
| 
								 | 
							
								# udf_example.so and LD_LIBRARY_PATH should be setup to point out where
							 | 
						||
| 
								 | 
							
								# the library are.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Test 1) Test UDFs via loadable libraries
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								--echo "*** Test 1) Test UDFs via loadable libraries ***
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
							 | 
						||
| 
								 | 
							
								eval CREATE FUNCTION myfunc_double RETURNS REAL SONAME "$UDF_EXAMPLE_LIB";
							 | 
						||
| 
								 | 
							
								--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
							 | 
						||
| 
								 | 
							
								eval CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "$UDF_EXAMPLE_LIB";
							 | 
						||
| 
								 | 
							
								--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
							 | 
						||
| 
								 | 
							
								--error ER_CANT_FIND_DL_ENTRY
							 | 
						||
| 
								 | 
							
								eval CREATE FUNCTION myfunc_nonexist RETURNS INTEGER SONAME "$UDF_EXAMPLE_LIB";
							 | 
						||
| 
								 | 
							
								--replace_column 3 UDF_LIB
							 | 
						||
| 
								 | 
							
								SELECT * FROM mysql.func ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								save_master_pos;
							 | 
						||
| 
								 | 
							
								connection slave;
							 | 
						||
| 
								 | 
							
								sync_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see that UDF CREATE statements were replicated
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								--replace_column 3 UDF_LIB
							 | 
						||
| 
								 | 
							
								SELECT * FROM mysql.func ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Use the UDFs to do something
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								eval CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=$engine_type;
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfunc_int(100), myfunc_double(50.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfunc_int(10), myfunc_double(5.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfunc_int(200), myfunc_double(25.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfunc_int(1), myfunc_double(500.00));
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY sum;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see if data was replicated
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY sum;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see that the functions are available for execution on the slave
							 | 
						||
| 
								 | 
							
								SELECT myfunc_int(25);
							 | 
						||
| 
								 | 
							
								SELECT myfunc_double(75.00);
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Drop the functions
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								DROP FUNCTION myfunc_double;
							 | 
						||
| 
								 | 
							
								DROP FUNCTION myfunc_int;
							 | 
						||
| 
								 | 
							
								SELECT * FROM mysql.func ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see if the UDFs were dropped on the slave
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT * FROM mysql.func ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								DROP TABLE t1;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Test 2) Test UDFs with SQL body
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								--echo "*** Test 2) Test UDFs with SQL body ***
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								CREATE FUNCTION myfuncsql_int(i INT) RETURNS INTEGER DETERMINISTIC RETURN i; 
							 | 
						||
| 
								 | 
							
								CREATE FUNCTION myfuncsql_double(d DOUBLE) RETURNS INTEGER DETERMINISTIC RETURN d * 2.00; 
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see that UDF CREATE statements were replicated
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Use the UDFs to do something
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								eval CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=$engine_type;
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfuncsql_int(100), myfuncsql_double(50.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfuncsql_int(10), myfuncsql_double(5.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfuncsql_int(200), myfuncsql_double(25.00));
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES(myfuncsql_int(1), myfuncsql_double(500.00));
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY sum;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see if data was replicated
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY sum;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Modify the UDFs to add a comment
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								ALTER FUNCTION myfuncsql_int COMMENT "This was altered.";
							 | 
						||
| 
								 | 
							
								ALTER FUNCTION myfuncsql_double COMMENT "This was altered.";
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see if data was replicated
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see that the functions are available for execution on the slave
							 | 
						||
| 
								 | 
							
								SELECT myfuncsql_int(25);
							 | 
						||
| 
								 | 
							
								SELECT myfuncsql_double(75.00);
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Drop the functions
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								DROP FUNCTION myfuncsql_double;
							 | 
						||
| 
								 | 
							
								DROP FUNCTION myfuncsql_int;
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sync_slave_with_master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check to see if the UDFs were dropped on the slave
							 | 
						||
| 
								 | 
							
								--echo "Running on the slave"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								SELECT db, name, type,  param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
							 | 
						||
| 
								 | 
							
								--disable_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								connection master;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								--echo "Running on the master"
							 | 
						||
| 
								 | 
							
								--enable_info
							 | 
						||
| 
								 | 
							
								DROP TABLE t1;
							 | 
						||
| 
								 | 
							
								--disable_info
							 |