218 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			218 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | ############################################### | ||
|  | #                                             # | ||
|  | #   Prepared Statements                       # | ||
|  | #   re-testing bug DB entries                 # | ||
|  | #                                             # | ||
|  | # The bugs are reported as "closed".          # | ||
|  | # Command sequences taken from bug report.    # | ||
|  | # No other test contains the bug# as comment. # | ||
|  | #                                             # | ||
|  | # Tests drop/create tables 't1', 't2', ...    # | ||
|  | #                                             # | ||
|  | ############################################### | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t1, t2; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | # bug#1180: optimized away part of WHERE clause cause incorect prepared satatement results | ||
|  | 
 | ||
|  | CREATE TABLE t1(session_id  char(9) NOT NULL); | ||
|  | INSERT INTO t1 VALUES ("abc"); | ||
|  | SELECT * FROM t1; | ||
|  | 
 | ||
|  | prepare st_1180 from 'SELECT * FROM t1 WHERE ?="1111" and session_id = "abc"'; | ||
|  | 
 | ||
|  | # Must not find a row | ||
|  | set @arg1= 'abc'; | ||
|  | execute st_1180 using @arg1; | ||
|  | 
 | ||
|  | # Now, it should find one row | ||
|  | set @arg1= '1111'; | ||
|  | execute st_1180 using @arg1; | ||
|  | 
 | ||
|  | # Back to non-matching | ||
|  | set @arg1= 'abc'; | ||
|  | execute st_1180 using @arg1; | ||
|  | 
 | ||
|  | drop table t1; | ||
|  | 
 | ||
|  | # end of bug#1180 | ||
|  | 
 | ||
|  | 
 | ||
|  | # bug#1644: Insertion of more than 3 NULL columns with parameter binding fails | ||
|  | 
 | ||
|  | # Using prepared statements, insertion of more than three columns with NULL | ||
|  | # values fails to insert additional NULLS.  After the third column NULLS will | ||
|  | # be inserted into the database as zeros. | ||
|  | # First insert four columns of a value (i.e. 22) to verify binding is working | ||
|  | # correctly.  Then Bind to each columns bind parameter an is_null value of 1. | ||
|  | # Then insert four more columns of integers, just for sanity. | ||
|  | # A subsequent select on the server will result in this: | ||
|  | # mysql> select * from foo_dfr; | ||
|  | # +------+------+------+------+ | ||
|  | # | col1 | col2 | col3 | col4 | | ||
|  | # +------+------+------+------+ | ||
|  | # |   22 |   22 |   22 |   22 | | ||
|  | # | NULL | NULL | NULL |    0 | | ||
|  | # |   88 |   88 |   88 |   88 | | ||
|  | # +------+------+------+------+ | ||
|  | 
 | ||
|  | # Test is extended to more columns - code stores bit vector in bytes. | ||
|  | 
 | ||
|  | create table t1 ( | ||
|  |   c_01 char(6), c_02 integer, c_03 real, c_04 int(3), c_05 varchar(20), | ||
|  |   c_06 date,    c_07 char(1), c_08 real, c_09 int(11), c_10 time, | ||
|  |   c_11 char(6), c_12 integer, c_13 real, c_14 int(3), c_15 varchar(20), | ||
|  |   c_16 date,    c_17 char(1), c_18 real, c_19 int(11), c_20 text); | ||
|  | # Do not use "timestamp" type, because it has a non-NULL default as of 4.1.2 | ||
|  | 
 | ||
|  | prepare st_1644 from 'insert into t1 values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; | ||
|  | 
 | ||
|  | set @arg01= 'row_1'; set @arg02= 1; set @arg03= 1.1; set @arg04= 111; set @arg05= 'row_one'; | ||
|  | set @arg06= '2004-10-12'; set @arg07= '1'; set @arg08= 1.1; set @arg09= '100100100'; set @arg10= '12:34:56'; | ||
|  | set @arg11= 'row_1'; set @arg12= 1; set @arg13= 1.1; set @arg14= 111; set @arg15= 'row_one'; | ||
|  | set @arg16= '2004-10-12'; set @arg17= '1'; set @arg18= 1.1; set @arg19= '100100100'; set @arg20= '12:34:56'; | ||
|  | execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10, | ||
|  |                       @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20; | ||
|  | 
 | ||
|  | set @arg01= NULL; set @arg02= NULL; set @arg03= NULL; set @arg04= NULL; set @arg05= NULL; | ||
|  | set @arg06= NULL; set @arg07= NULL; set @arg08= NULL; set @arg09= NULL; set @arg10= NULL; | ||
|  | set @arg11= NULL; set @arg12= NULL; set @arg13= NULL; set @arg14= NULL; set @arg15= NULL; | ||
|  | set @arg16= NULL; set @arg17= NULL; set @arg18= NULL; set @arg19= NULL; set @arg20= NULL; | ||
|  | execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10, | ||
|  |                       @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20; | ||
|  | 
 | ||
|  | set @arg01= 'row_3'; set @arg02= 3; set @arg03= 3.3; set @arg04= 333; set @arg05= 'row_three'; | ||
|  | set @arg06= '2004-10-12'; set @arg07= '3'; set @arg08= 3.3; set @arg09= '300300300'; set @arg10= '12:34:56'; | ||
|  | set @arg11= 'row_3'; set @arg12= 3; set @arg13= 3.3; set @arg14= 333; set @arg15= 'row_three'; | ||
|  | set @arg16= '2004-10-12'; set @arg17= '3'; set @arg18= 3.3; set @arg19= '300300300'; set @arg20= '12:34:56'; | ||
|  | execute st_1644 using @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07, @arg08, @arg09, @arg10, | ||
|  |                       @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, @arg18, @arg19, @arg20; | ||
|  | 
 | ||
|  | select * from t1; | ||
|  | 
 | ||
|  | drop table t1; | ||
|  | 
 | ||
|  | # end of bug#1644 | ||
|  | 
 | ||
|  | 
 | ||
|  | # bug#1676: Prepared statement two-table join returns no rows when one is expected | ||
|  | 
 | ||
|  | create table t1( | ||
|  |    cola varchar(50) not null, | ||
|  |    colb varchar(8) not null, | ||
|  |    colc varchar(12) not null, | ||
|  |    cold varchar(2) not null, | ||
|  |    primary key (cola, colb, cold)); | ||
|  | 
 | ||
|  | create table t2( | ||
|  |    cola varchar(50) not null, | ||
|  |    colb varchar(8) not null, | ||
|  |    colc varchar(2) not null, | ||
|  |    cold float, | ||
|  |    primary key (cold)); | ||
|  | 
 | ||
|  | insert into t1 values ('aaaa', 'yyyy', 'yyyy-dd-mm', 'R'); | ||
|  | 
 | ||
|  | insert into t2 values ('aaaa', 'yyyy', 'R', 203), ('bbbb', 'zzzz', 'C', 201); | ||
|  | 
 | ||
|  | prepare st_1676 from 'select a.cola, a.colb, a.cold from t1 a, t2 b where a.cola = ? and a.colb = ? and a.cold = ? and b.cola = a.cola and b.colb = a.colb and b.colc = a.cold'; | ||
|  | 
 | ||
|  | set @arg0= "aaaa"; | ||
|  | set @arg1= "yyyy"; | ||
|  | set @arg2= "R"; | ||
|  | 
 | ||
|  | execute st_1676 using @arg0, @arg1, @arg2; | ||
|  | 
 | ||
|  | drop table t1, t2; | ||
|  | 
 | ||
|  | # end of bug#1676 | ||
|  | 
 | ||
|  | # End of 4.1 tests | ||
|  | 
 | ||
|  | # bug#18492: mysqld reports ER_ILLEGAL_REFERENCE in --ps-protocol | ||
|  | 
 | ||
|  | create table t1 (a int primary key); | ||
|  | insert into t1 values (1); | ||
|  | 
 | ||
|  | explain select * from t1 where 3 in (select (1+1) union select 1); | ||
|  | 
 | ||
|  | select * from t1 where 3 in (select (1+1) union select 1); | ||
|  | 
 | ||
|  | prepare st_18492 from 'select * from t1 where 3 in (select (1+1) union select 1)'; | ||
|  | execute st_18492; | ||
|  | 
 | ||
|  | drop table t1; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#19356: Assertion failure with undefined @uservar in prepared statement execution | ||
|  | #  | ||
|  | create table t1 (a int, b varchar(4)); | ||
|  | create table t2 (a int, b varchar(4), primary key(a)); | ||
|  | 
 | ||
|  | prepare stmt1 from 'insert into t1 (a, b) values (?, ?)'; | ||
|  | prepare stmt2 from 'insert into t2 (a, b) values (?, ?)'; | ||
|  | 
 | ||
|  | set @intarg= 11; | ||
|  | set @varchararg= '2222'; | ||
|  | execute stmt1 using @intarg, @varchararg; | ||
|  | execute stmt2 using @intarg, @varchararg; | ||
|  | set @intarg= 12; | ||
|  | execute stmt1 using @intarg, @UNDEFINED; | ||
|  | execute stmt2 using @intarg, @UNDEFINED; | ||
|  | set @intarg= 13; | ||
|  | execute stmt1 using @UNDEFINED, @varchararg; | ||
|  | --error 1048 | ||
|  | execute stmt2 using @UNDEFINED, @varchararg; | ||
|  | set @intarg= 14; | ||
|  | set @nullarg= Null; | ||
|  | execute stmt1 using @UNDEFINED, @nullarg; | ||
|  | --error 1048 | ||
|  | execute stmt2 using @nullarg, @varchararg; | ||
|  | 
 | ||
|  | select * from t1; | ||
|  | select * from t2; | ||
|  | 
 | ||
|  | drop table t1; | ||
|  | drop table t2; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug #32124: crash if prepared statements refer to variables in the where | ||
|  | # clause | ||
|  | # | ||
|  | 
 | ||
|  | CREATE TABLE t1 (a INT); | ||
|  | PREPARE stmt FROM 'select 1 from `t1` where `a` = any (select (@@tmpdir))'; | ||
|  | EXECUTE stmt; | ||
|  | DEALLOCATE PREPARE stmt; | ||
|  | DROP TABLE t1; | ||
|  | 
 | ||
|  | CREATE TABLE t2 (a INT PRIMARY KEY); | ||
|  | INSERT INTO t2 VALUES (400000), (400001); | ||
|  | 
 | ||
|  | SET @@sort_buffer_size=400000; | ||
|  | 
 | ||
|  | DELIMITER |; | ||
|  | 
 | ||
|  | CREATE FUNCTION p1(i INT) RETURNS INT | ||
|  | BEGIN | ||
|  |   SET @@sort_buffer_size= i; | ||
|  |   RETURN i + 1; | ||
|  | END| | ||
|  | 
 | ||
|  | DELIMITER ;| | ||
|  | 
 | ||
|  | SELECT * FROM t2 WHERE a = @@sort_buffer_size AND p1(@@sort_buffer_size + 1) > a - 1; | ||
|  | 
 | ||
|  | DROP TABLE t2; | ||
|  | DROP FUNCTION p1; | ||
|  | 
 | ||
|  | 
 | ||
|  | SELECT CONCAT(@@sort_buffer_size); | ||
|  | SELECT LEFT("12345", @@ft_boolean_syntax); | ||
|  | 
 | ||
|  | SET @@sort_buffer_size=DEFAULT; | ||
|  | 
 | ||
|  | --echo End of 5.0 tests. |