ps_modify.inc
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. ###################### ps_modify.inc #########################
  2. #                                                            #
  3. #  Tests for prepared statements: INSERT/DELETE/UPDATE...    #
  4. #                                                            #
  5. ##############################################################
  6. #    
  7. # NOTE: PLEASE SEE ps_1general.test (bottom) 
  8. #       BEFORE ADDING NEW TEST CASES HERE !!!
  9. #
  10. # Please be aware, that this file will be sourced by several test case files
  11. # stored within the subdirectory 't'. So every change here will affect 
  12. # several test cases.
  13. #
  14. # Please do not modify the structure (DROP/ALTER..) of the tables
  15. #     't1' and 't9'. 
  16. #
  17. # But you are encouraged to use these two tables within your statements
  18. # (DELETE/UPDATE/...) whenever possible. 
  19. #     t1  - very simple table
  20. #     t9  - table with nearly all available column types
  21. #
  22. # The structure and the content of these tables can be found in
  23. #     include/ps_create.inc  CREATE TABLE ...
  24. #     include/ps_renew.inc   DELETE all rows and INSERT some rows
  25. #
  26. # Both tables are managed by the same storage engine.
  27. # The type of the storage engine is stored in the variable '$type' . 
  28. #------------------- Please insert your test cases here -------------------#
  29. #-------- Please be very carefull when editing behind this line  ----------#
  30. --disable_query_log
  31. select '------ delete tests ------' as test_sequence ;
  32. --enable_query_log
  33. --source include/ps_renew.inc
  34. ## delete without parameter
  35. prepare stmt1 from 'delete from t1 where a=2' ;
  36. execute stmt1;
  37. select a,b from t1 where a=2;
  38. # delete with row not found
  39. execute stmt1;
  40. ## delete with one parameter in the where clause
  41. insert into t1 values(0,NULL);
  42. set @arg00=NULL;
  43. prepare stmt1 from 'delete from t1 where b=?' ;
  44. execute stmt1 using @arg00;
  45. select a,b from t1 where b is NULL ;
  46. set @arg00='one';
  47. execute stmt1 using @arg00;
  48. select a,b from t1 where b=@arg00;
  49. ## truncate a table
  50. --error 1295
  51. prepare stmt1 from 'truncate table t1' ;
  52. --disable_query_log
  53. select '------ update tests ------' as test_sequence ;
  54. --enable_query_log
  55. --source include/ps_renew.inc
  56. ## update without parameter
  57. prepare stmt1 from 'update t1 set b=''a=two'' where a=2' ;
  58. execute stmt1;
  59. select a,b from t1 where a=2;
  60. # dummy update
  61. execute stmt1;
  62. select a,b from t1 where a=2;
  63. ## update with one parameter in the set clause
  64. set @arg00=NULL;
  65. prepare stmt1 from 'update t1 set b=? where a=2' ;
  66. execute stmt1 using @arg00;
  67. select a,b from t1 where a=2;
  68. set @arg00='two';
  69. execute stmt1 using @arg00;
  70. select a,b from t1 where a=2;
  71. ## update with one parameter in the where cause
  72. set @arg00=2;
  73. prepare stmt1 from 'update t1 set b=NULL where a=?' ;
  74. execute stmt1 using @arg00;
  75. select a,b from t1 where a=@arg00;
  76. update t1 set b='two' where a=@arg00;
  77. # row not found in update
  78. set @arg00=2000;
  79. execute stmt1 using @arg00;
  80. select a,b from t1 where a=@arg00;
  81. ## update on primary key column (two parameters)
  82. set @arg00=2;
  83. set @arg01=22;
  84. prepare stmt1 from 'update t1 set a=? where a=?' ;
  85. # dummy update
  86. execute stmt1 using @arg00, @arg00;
  87. select a,b from t1 where a=@arg00;
  88. execute stmt1 using @arg01, @arg00;
  89. select a,b from t1 where a=@arg01;
  90. execute stmt1 using @arg00, @arg01;
  91. select a,b from t1 where a=@arg00;
  92. set @arg00=NULL;
  93. set @arg01=2;
  94. execute stmt1 using @arg00, @arg01;
  95. select a,b from t1 order by a;
  96. set @arg00=0;
  97. execute stmt1 using @arg01, @arg00;
  98. select a,b from t1 order by a;
  99. ## update with subquery and several parameters
  100. set @arg00=23;
  101. set @arg01='two';
  102. set @arg02=2;
  103. set @arg03='two';
  104. set @arg04=2;
  105. --disable_warnings
  106. drop table if exists t2;
  107. --enable_warnings
  108. # t2 will be of table type 'MYISAM'
  109. create table t2 as select a,b from t1 ;
  110. prepare stmt1 from 'update t1 set a=? where b=?
  111.                     and a in (select ? from t2
  112.                               where b = ? or a = ?)';
  113. --enable_info
  114. execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
  115. --disable_info
  116. select a,b from t1 where a = @arg00 ;
  117. prepare stmt1 from 'update t1 set a=? where b=?
  118.                     and a not in (select ? from t2
  119.                               where b = ? or a = ?)';
  120. --enable_info
  121. execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
  122. --disable_info
  123. select a,b from t1 order by a ;
  124. drop table t2 ;
  125. # t2 is now of table type '$type'
  126. # The test battery for table type 'MERGE' gets here only a 'MYISAM' table
  127. #
  128. # Test UPDATE with SUBQUERY in prepared mode
  129. #
  130. eval create table t2
  131. (
  132.   a int, b varchar(30),
  133.   primary key(a)
  134. ) engine = $type ;
  135. insert into t2(a,b) select a, b from t1 ;
  136. prepare stmt1 from 'update t1 set a=? where b=?
  137.                     and a in (select ? from t2
  138.                               where b = ? or a = ?)';
  139. --enable_info
  140. execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ;
  141. --disable_info
  142. select a,b from t1 where a = @arg00 ;
  143. prepare stmt1 from 'update t1 set a=? where b=?
  144.                     and a not in (select ? from t2
  145.                               where b = ? or a = ?)';
  146. --enable_info
  147. execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ;
  148. --disable_info
  149. select a,b from t1 order by a ;
  150. drop table t2 ;
  151. ## update with parameters in limit
  152. set @arg00=1;
  153. prepare stmt1 from 'update t1 set b=''bla''
  154. where a=2
  155. limit 1';
  156. execute stmt1 ;
  157. select a,b from t1 where b = 'bla' ;
  158. # currently (May 2004, Version 4.1) it is impossible
  159. -- error 1064
  160. prepare stmt1 from 'update t1 set b=''bla''
  161. where a=2
  162. limit ?';
  163. --disable_query_log
  164. select '------ insert tests ------' as test_sequence ;
  165. --enable_query_log
  166. --source include/ps_renew.inc
  167. ## insert without parameter
  168. prepare stmt1 from 'insert into t1 values(5, ''five'' )';
  169. execute stmt1;
  170. select a,b from t1 where a = 5;
  171. ## insert with one parameter in values part
  172. set @arg00='six' ;
  173. prepare stmt1 from 'insert into t1 values(6, ? )';
  174. execute stmt1 using @arg00;
  175. select a,b from t1 where b = @arg00;
  176. # the second insert fails, because the first column is primary key
  177. --error 1062
  178. execute stmt1 using @arg00;
  179. set @arg00=NULL ;
  180. prepare stmt1 from 'insert into t1 values(0, ? )';
  181. execute stmt1 using @arg00;
  182. select a,b from t1 where b is NULL;
  183. ## insert with two parameter in values part
  184. set @arg00=8 ;
  185. set @arg01='eight' ;
  186. prepare stmt1 from 'insert into t1 values(?, ? )';
  187. execute stmt1 using @arg00, @arg01 ;
  188. select a,b from t1 where b = @arg01;
  189. # cases derived from client_test.c: test_null()
  190. set @NULL= null ;
  191. set @arg00= 'abc' ;
  192. # execute must fail, because first column is primary key (-> not null)
  193. --error 1048
  194. execute stmt1 using @NULL, @NULL ;
  195. --error 1048
  196. execute stmt1 using @NULL, @NULL ;
  197. --error 1048
  198. execute stmt1 using @NULL, @arg00 ;
  199. --error 1048
  200. execute stmt1 using @NULL, @arg00 ;
  201. let $1 = 2;
  202. while ($1)
  203. {
  204.   eval set @arg01= 10000 + $1 ;
  205.   execute stmt1 using @arg01, @arg00 ;
  206.   dec $1;
  207. }
  208. select * from t1 where a > 10000 order by a ;
  209. delete from t1 where a > 10000 ;
  210. let $1 = 2;
  211. while ($1)
  212. {
  213.   eval set @arg01= 10000 + $1 ;
  214.   execute stmt1 using @arg01, @NULL ;
  215.   dec $1;
  216. }
  217. select * from t1 where a > 10000 order by a ;
  218. delete from t1 where a > 10000 ;
  219. let $1 = 10;
  220. while ($1)
  221. {
  222.   eval set @arg01= 10000 + $1 ;
  223.   execute stmt1 using @arg01, @arg01 ;
  224.   dec $1;
  225. }
  226. select * from t1 where a > 10000 order by a ;
  227. delete from t1 where a > 10000 ;
  228. ## insert with two rows in values part
  229. set @arg00=81 ;
  230. set @arg01='8-1' ;
  231. set @arg02=82 ;
  232. set @arg03='8-2' ;
  233. prepare stmt1 from 'insert into t1 values(?,?),(?,?)';
  234. execute stmt1 using @arg00, @arg01, @arg02, @arg03 ;
  235. select a,b from t1 where a in (@arg00,@arg02) ;
  236. ## insert with two parameter in the set part
  237. set @arg00=9 ;
  238. set @arg01='nine' ;
  239. prepare stmt1 from 'insert into t1 set a=?, b=? ';
  240. execute stmt1 using @arg00, @arg01 ;
  241. select a,b from t1 where a = @arg00 ;
  242. ## insert with parameters in the ON DUPLICATE KEY part 
  243. set @arg00=6 ;
  244. set @arg01=1 ;
  245. prepare stmt1 from 'insert into t1 set a=?, b=''sechs''
  246.                     on duplicate key update a=a + ?, b=concat(b,''modified'') ';
  247. execute stmt1 using @arg00, @arg01;
  248. select * from t1 order by a;
  249. set @arg00=81 ;
  250. set @arg01=1 ;
  251. --error 1062
  252. execute stmt1 using @arg00, @arg01;
  253. ## insert, autoincrement column and ' SELECT LAST_INSERT_ID() '
  254. # cases derived from client_test.c: test_bug3117()
  255. --disable_warnings
  256. drop table if exists t2 ;
  257. --enable_warnings
  258. # The test battery for table type 'MERGE' gets here only a 'MYISAM' table
  259. eval create table t2 (id int auto_increment primary key) 
  260. ENGINE= $type ;
  261. prepare stmt1 from ' select last_insert_id() ' ;
  262. insert into t2 values (NULL) ;
  263. execute stmt1 ;
  264. insert into t2 values (NULL) ;
  265. # bug#3117
  266. execute stmt1 ;
  267. drop table t2 ;
  268. ## many parameters
  269. set @1000=1000 ;
  270. set @x1000_2="x1000_2" ;
  271. set @x1000_3="x1000_3" ;
  272. set @x1000="x1000" ;
  273. set @1100=1100 ;
  274. set @x1100="x1100" ;
  275. set @100=100 ;
  276. set @updated="updated" ;
  277. insert into t1 values(1000,'x1000_1') ;
  278. insert into t1 values(@1000,@x1000_2),(@1000,@x1000_3)
  279.                on duplicate key update a = a + @100, b = concat(b,@updated) ;
  280. select a,b from t1 where a >= 1000 order by a ;
  281. delete from t1 where a >= 1000 ;
  282. insert into t1 values(1000,'x1000_1') ;
  283. prepare stmt1 from ' insert into t1 values(?,?),(?,?)
  284.                on duplicate key update a = a + ?, b = concat(b,?) ';
  285. execute stmt1 using @1000, @x1000_2, @1000, @x1000_3, @100, @updated ;
  286. select a,b from t1 where a >= 1000 order by a ;
  287. delete from t1 where a >= 1000 ;
  288. insert into t1 values(1000,'x1000_1') ;
  289. execute stmt1 using @1000, @x1000_2, @1100, @x1000_3, @100, @updated ;
  290. select a,b from t1 where a >= 1000 order by a ;
  291. delete from t1 where a >= 1000 ;
  292. ## replace
  293. prepare stmt1 from ' replace into t1 (a,b) select 100, ''hundred'' ';
  294. execute stmt1;
  295. execute stmt1;
  296. execute stmt1;
  297. ## multi table statements
  298. --disable_query_log
  299. select '------ multi table tests ------' as test_sequence ;
  300. --enable_query_log
  301. # cases derived from client_test.c: test_multi
  302. delete from t1 ;
  303. delete from t9 ;
  304. insert into t1(a,b) values (1, 'one'), (2, 'two'), (3, 'three') ;
  305. insert into t9 (c1,c21)
  306.   values (1, 'one'), (2, 'two'), (3, 'three') ;
  307. prepare stmt_delete from " delete t1, t9 
  308.   from t1, t9 where t1.a=t9.c1 and t1.b='updated' ";
  309. prepare stmt_update from " update t1, t9 
  310.   set t1.b='updated', t9.c21='updated'
  311.   where t1.a=t9.c1 and t1.a=? ";
  312. prepare stmt_select1 from " select a, b from t1 order by a" ;
  313. prepare stmt_select2 from " select c1, c21 from t9 order by c1" ;
  314. set @arg00= 1 ;
  315. let $1= 3 ;
  316. while ($1)
  317. {
  318.   execute stmt_update using @arg00 ;
  319.   execute stmt_delete ;
  320.   execute stmt_select1 ;
  321.   execute stmt_select2 ;
  322.   set @arg00= @arg00 + 1 ;
  323.   dec $1 ;
  324. }