You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1092 lines
29 KiB

Patch for WL#2894: Make stored routine variables work according to the standard. The idea is to use Field-classes to implement stored routines variables. Also, we should provide facade to Item-hierarchy by Item_field class (it is necessary, since SRVs take part in expressions). The patch fixes the following bugs: - BUG#8702: Stored Procedures: No Error/Warning shown for inappropriate data type matching; - BUG#8768: Functions: For any unsigned data type, -ve values can be passed and returned; - BUG#8769: Functions: For Int datatypes, out of range values can be passed and returned; - BUG#9078: STORED PROCDURE: Decimal digits are not displayed when we use DECIMAL datatype; - BUG#9572: Stored procedures: variable type declarations ignored; - BUG#12903: upper function does not work inside a function; - BUG#13705: parameters to stored procedures are not verified; - BUG#13808: ENUM type stored procedure parameter accepts non-enumerated data; - BUG#13909: Varchar Stored Procedure Parameter always BINARY string (ignores CHARACTER SET); - BUG#14161: Stored procedure cannot retrieve bigint unsigned; - BUG#14188: BINARY variables have no 0x00 padding; - BUG#15148: Stored procedure variables accept non-scalar values; mysql-test/r/ctype_ujis.result: Explicitly specify correct charset. mysql-test/r/schema.result: Drop our test database to not affect this test if some test left it cause of failure. mysql-test/r/show_check.result: Drop our test database to not affect this test if some test left it cause of failure. mysql-test/r/skip_name_resolve.result: Ignore columns with unpredictable values. mysql-test/r/sp-big.result: Add cleanup statement. mysql-test/r/sp-dynamic.result: Add cleanup statements. mysql-test/r/sp.result: Update result file. mysql-test/r/sum_distinct-big.result: Update result file. mysql-test/r/type_newdecimal-big.result: Update result file. mysql-test/t/ctype_ujis.test: Explicitly specify correct charset. mysql-test/t/schema.test: Drop our test database to not affect this test if some test left it cause of failure. mysql-test/t/show_check.test: Drop our test database to not affect this test if some test left it cause of failure. mysql-test/t/skip_name_resolve.test: Ignore columns with unpredictable values. mysql-test/t/sp-big.test: Add cleanup statement. mysql-test/t/sp-dynamic.test: Add cleanup statements. mysql-test/t/sp.test: Non-scalar values prohibited for assignment to SP-vars; polishing. mysql-test/t/type_newdecimal-big.test: Update type specification so that the variables can contain the large values used in the test. sql/field.cc: Extract create_field::init() to initialize an existing instance of create_field from new_create_field(). sql/field.h: Extract create_field::init() to initialize an existing instance of create_field from new_create_field(). sql/item.cc: - Introduce a new class: Item_sp_variable -- a base class of stored-routine-variables classes; - Introduce Item_case_expr -- an Item, which is used to access to the expression of CASE statement; sql/item.h: - Introduce a new class: Item_sp_variable -- a base class of stored-routine-variables classes; - Introduce Item_case_expr -- an Item, which is used to access to the expression of CASE statement; sql/item_func.cc: Pass the Field (instead of Item) for the return value of a function to the function execution routine. sql/item_func.h: Pass the Field (instead of Item) for the return value of a function to the function execution routine. sql/mysql_priv.h: Move create_virtual_tmp_table() out of sql_select.h. sql/sp.cc: Use create_result_field() instead of make_field(). sql/sp_head.cc: - Add a function to map enum_field_types to Item::Type; - Add sp_instr_push_case_expr instruction -- an instruction to push CASE expression into the active running context; - Add sp_instr_pop_case_expr instruction -- an instruction to pop CASE expression from the active running context; - Adapt the SP-execution code to using Fields instead of Items for SP-vars; - Use create_field structure for field description instead of a set of members. sql/sp_head.h: - Add a function to map enum_field_types to Item::Type; - Add sp_instr_push_case_expr instruction -- an instruction to push CASE expression into the active running context; - Add sp_instr_pop_case_expr instruction -- an instruction to pop CASE expression from the active running context; - Adapt the SP-execution code to using Fields instead of Items for SP-vars; - Use create_field structure for field description instead of a set of members. sql/sp_pcontext.cc: - Change rules to assign an index of SP-variable: use transparent index; - Add an operation to retrieve a list of defined SP-vars from the processing context recursively. sql/sp_pcontext.h: - Change rules to assign an index of SP-variable: use transparent index; - Add an operation to retrieve a list of defined SP-vars from the processing context recursively. sql/sp_rcontext.cc: - Change rules to assign an index of SP-variable: use transparent index; - Use a tmp virtual table to store SP-vars instead of Items; - Provide operations to work with CASE expresion. sql/sp_rcontext.h: - Change rules to assign an index of SP-variable: use transparent index; - Use a tmp virtual table to store SP-vars instead of Items; - Provide operations to work with CASE expresion. sql/sql_class.cc: - Reflect Item_splocal ctor changes; - Item_splocal::get_offset() has been renamed to get_var_idx(). sql/sql_class.h: Polishing. sql/sql_parse.cc: Extract create_field::init() to initialize an existing instance of create_field from new_create_field(). sql/sql_select.cc: Take care of BLOB columns in create_virtual_tmp_table(). sql/sql_select.h: Move create_virtual_tmp_table() out of sql_select.h. sql/sql_trigger.cc: Use boolean constants for boolean type instead of numerical ones. sql/sql_yacc.yy: Provide an instance of create_field for each SP-var. mysql-test/include/sp-vars.inc: The definitions of common-procedures, which are created under different circumstances. mysql-test/r/sp-vars.result: Result file for the SP-vars test. mysql-test/sp-vars.test: A new test for checking SP-vars functionality.
20 years ago
  1. DROP PROCEDURE IF EXISTS sp_vars_check_dflt;
  2. DROP PROCEDURE IF EXISTS sp_vars_check_assignment;
  3. DROP FUNCTION IF EXISTS sp_vars_check_ret1;
  4. DROP FUNCTION IF EXISTS sp_vars_check_ret2;
  5. DROP FUNCTION IF EXISTS sp_vars_check_ret3;
  6. DROP FUNCTION IF EXISTS sp_vars_check_ret4;
  7. SET @@sql_mode = 'ansi';
  8. CREATE PROCEDURE sp_vars_check_dflt()
  9. BEGIN
  10. DECLARE v1 TINYINT DEFAULT 1e200;
  11. DECLARE v1u TINYINT UNSIGNED DEFAULT 1e200;
  12. DECLARE v2 TINYINT DEFAULT -1e200;
  13. DECLARE v2u TINYINT UNSIGNED DEFAULT -1e200;
  14. DECLARE v3 TINYINT DEFAULT 300;
  15. DECLARE v3u TINYINT UNSIGNED DEFAULT 300;
  16. DECLARE v4 TINYINT DEFAULT -300;
  17. DECLARE v4u TINYINT UNSIGNED DEFAULT -300;
  18. DECLARE v5 TINYINT DEFAULT 10 * 10 * 10;
  19. DECLARE v5u TINYINT UNSIGNED DEFAULT 10 * 10 * 10;
  20. DECLARE v6 TINYINT DEFAULT -10 * 10 * 10;
  21. DECLARE v6u TINYINT UNSIGNED DEFAULT -10 * 10 * 10;
  22. DECLARE v7 TINYINT DEFAULT '10';
  23. DECLARE v8 TINYINT DEFAULT '10 ';
  24. DECLARE v9 TINYINT DEFAULT ' 10 ';
  25. DECLARE v10 TINYINT DEFAULT 'String 10 ';
  26. DECLARE v11 TINYINT DEFAULT 'String10';
  27. DECLARE v12 TINYINT DEFAULT '10 String';
  28. DECLARE v13 TINYINT DEFAULT '10String';
  29. DECLARE v14 TINYINT DEFAULT concat('10', ' ');
  30. DECLARE v15 TINYINT DEFAULT concat(' ', '10');
  31. DECLARE v16 TINYINT DEFAULT concat('Hello, ', 'world');
  32. DECLARE v17 DECIMAL(64, 2) DEFAULT 12;
  33. DECLARE v18 DECIMAL(64, 2) DEFAULT 12.123;
  34. DECLARE v19 DECIMAL(64, 2) DEFAULT 11 + 1;
  35. DECLARE v20 DECIMAL(64, 2) DEFAULT 12 + 0.123;
  36. SELECT v1, v1u, v2, v2u, v3, v3u, v4, v4u;
  37. SELECT v5, v5u, v6, v6u;
  38. SELECT v7, v8, v9, v10, v11, v12, v13, v14, v15, v16;
  39. SELECT v17, v18, v19, v20;
  40. END|
  41. CREATE PROCEDURE sp_vars_check_assignment()
  42. BEGIN
  43. DECLARE i1, i2, i3, i4 TINYINT;
  44. DECLARE u1, u2, u3, u4 TINYINT UNSIGNED;
  45. DECLARE d1, d2, d3 DECIMAL(64, 2);
  46. SET i1 = 1e200;
  47. SET i2 = -1e200;
  48. SET i3 = 300;
  49. SET i4 = -300;
  50. SELECT i1, i2, i3, i4;
  51. SET i1 = 10 * 10 * 10;
  52. SET i2 = -10 * 10 * 10;
  53. SET i3 = sign(10 * 10) * 10 * 20;
  54. SET i4 = sign(-10 * 10) * -10 * 20;
  55. SELECT i1, i2, i3, i4;
  56. SET u1 = 1e200;
  57. SET u2 = -1e200;
  58. SET u3 = 300;
  59. SET u4 = -300;
  60. SELECT u1, u2, u3, u4;
  61. SET u1 = 10 * 10 * 10;
  62. SET u2 = -10 * 10 * 10;
  63. SET u3 = sign(10 * 10) * 10 * 20;
  64. SET u4 = sign(-10 * 10) * -10 * 20;
  65. SELECT u1, u2, u3, u4;
  66. SET d1 = 1234;
  67. SET d2 = 1234.12;
  68. SET d3 = 1234.1234;
  69. SELECT d1, d2, d3;
  70. SET d1 = 12 * 100 + 34;
  71. SET d2 = 12 * 100 + 34 + 0.12;
  72. SET d3 = 12 * 100 + 34 + 0.1234;
  73. SELECT d1, d2, d3;
  74. END|
  75. CREATE FUNCTION sp_vars_check_ret1() RETURNS TINYINT
  76. BEGIN
  77. RETURN 1e200;
  78. END|
  79. CREATE FUNCTION sp_vars_check_ret2() RETURNS TINYINT
  80. BEGIN
  81. RETURN 10 * 10 * 10;
  82. END|
  83. CREATE FUNCTION sp_vars_check_ret3() RETURNS TINYINT
  84. BEGIN
  85. RETURN 'Hello, world';
  86. END|
  87. CREATE FUNCTION sp_vars_check_ret4() RETURNS DECIMAL(64, 2)
  88. BEGIN
  89. RETURN 12 * 10 + 34 + 0.1234;
  90. END|
  91. ---------------------------------------------------------------
  92. Calling the routines, created in ANSI mode.
  93. ---------------------------------------------------------------
  94. CALL sp_vars_check_dflt();
  95. v1 v1u v2 v2u v3 v3u v4 v4u
  96. 127 255 -128 0 127 255 -128 0
  97. v5 v5u v6 v6u
  98. 127 255 -128 0
  99. v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
  100. 10 10 10 0 0 10 10 10 10 0
  101. v17 v18 v19 v20
  102. 12.00 12.12 12.00 12.12
  103. Warnings:
  104. Warning 1264 Out of range value adjusted for column 'v1' at row 1
  105. Warning 1264 Out of range value adjusted for column 'v1u' at row 1
  106. Warning 1264 Out of range value adjusted for column 'v2' at row 1
  107. Warning 1264 Out of range value adjusted for column 'v2u' at row 1
  108. Warning 1264 Out of range value adjusted for column 'v3' at row 1
  109. Warning 1264 Out of range value adjusted for column 'v3u' at row 1
  110. Warning 1264 Out of range value adjusted for column 'v4' at row 1
  111. Warning 1264 Out of range value adjusted for column 'v4u' at row 1
  112. Warning 1264 Out of range value adjusted for column 'v5' at row 1
  113. Warning 1264 Out of range value adjusted for column 'v5u' at row 1
  114. Warning 1264 Out of range value adjusted for column 'v6' at row 1
  115. Warning 1264 Out of range value adjusted for column 'v6u' at row 1
  116. Warning 1366 Incorrect integer value: 'String 10 ' for column 'v10' at row 1
  117. Warning 1366 Incorrect integer value: 'String10' for column 'v11' at row 1
  118. Warning 1265 Data truncated for column 'v12' at row 1
  119. Warning 1265 Data truncated for column 'v13' at row 1
  120. Warning 1366 Incorrect integer value: 'Hello, world' for column 'v16' at row 1
  121. Note 1265 Data truncated for column 'v18' at row 1
  122. Note 1265 Data truncated for column 'v20' at row 1
  123. CALL sp_vars_check_assignment();
  124. i1 i2 i3 i4
  125. 127 -128 127 -128
  126. i1 i2 i3 i4
  127. 127 -128 127 127
  128. u1 u2 u3 u4
  129. 255 0 255 0
  130. u1 u2 u3 u4
  131. 255 0 200 200
  132. d1 d2 d3
  133. 1234.00 1234.12 1234.12
  134. d1 d2 d3
  135. 1234.00 1234.12 1234.12
  136. Warnings:
  137. Warning 1264 Out of range value adjusted for column 'i1' at row 1
  138. Warning 1264 Out of range value adjusted for column 'i2' at row 1
  139. Warning 1264 Out of range value adjusted for column 'i3' at row 1
  140. Warning 1264 Out of range value adjusted for column 'i4' at row 1
  141. Warning 1264 Out of range value adjusted for column 'i1' at row 1
  142. Warning 1264 Out of range value adjusted for column 'i2' at row 1
  143. Warning 1264 Out of range value adjusted for column 'i3' at row 1
  144. Warning 1264 Out of range value adjusted for column 'i4' at row 1
  145. Warning 1264 Out of range value adjusted for column 'u1' at row 1
  146. Warning 1264 Out of range value adjusted for column 'u2' at row 1
  147. Warning 1264 Out of range value adjusted for column 'u3' at row 1
  148. Warning 1264 Out of range value adjusted for column 'u4' at row 1
  149. Warning 1264 Out of range value adjusted for column 'u1' at row 1
  150. Warning 1264 Out of range value adjusted for column 'u2' at row 1
  151. Note 1265 Data truncated for column 'd3' at row 1
  152. Note 1265 Data truncated for column 'd3' at row 1
  153. SELECT sp_vars_check_ret1();
  154. sp_vars_check_ret1()
  155. 127
  156. Warnings:
  157. Warning 1264 Out of range value adjusted for column 'sp_vars_check_ret1()' at row 1
  158. SELECT sp_vars_check_ret2();
  159. sp_vars_check_ret2()
  160. 127
  161. Warnings:
  162. Warning 1264 Out of range value adjusted for column 'sp_vars_check_ret2()' at row 1
  163. SELECT sp_vars_check_ret3();
  164. sp_vars_check_ret3()
  165. 0
  166. Warnings:
  167. Warning 1366 Incorrect integer value: 'Hello, world' for column 'sp_vars_check_ret3()' at row 1
  168. SELECT sp_vars_check_ret4();
  169. sp_vars_check_ret4()
  170. 154.12
  171. Warnings:
  172. Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
  173. SET @@sql_mode = 'traditional';
  174. ---------------------------------------------------------------
  175. Calling in TRADITIONAL mode the routines, created in ANSI mode.
  176. ---------------------------------------------------------------
  177. CALL sp_vars_check_dflt();
  178. v1 v1u v2 v2u v3 v3u v4 v4u
  179. 127 255 -128 0 127 255 -128 0
  180. v5 v5u v6 v6u
  181. 127 255 -128 0
  182. v7 v8 v9 v10 v11 v12 v13 v14 v15 v16
  183. 10 10 10 0 0 10 10 10 10 0
  184. v17 v18 v19 v20
  185. 12.00 12.12 12.00 12.12
  186. Warnings:
  187. Warning 1264 Out of range value adjusted for column 'v1' at row 1
  188. Warning 1264 Out of range value adjusted for column 'v1u' at row 1
  189. Warning 1264 Out of range value adjusted for column 'v2' at row 1
  190. Warning 1264 Out of range value adjusted for column 'v2u' at row 1
  191. Warning 1264 Out of range value adjusted for column 'v3' at row 1
  192. Warning 1264 Out of range value adjusted for column 'v3u' at row 1
  193. Warning 1264 Out of range value adjusted for column 'v4' at row 1
  194. Warning 1264 Out of range value adjusted for column 'v4u' at row 1
  195. Warning 1264 Out of range value adjusted for column 'v5' at row 1
  196. Warning 1264 Out of range value adjusted for column 'v5u' at row 1
  197. Warning 1264 Out of range value adjusted for column 'v6' at row 1
  198. Warning 1264 Out of range value adjusted for column 'v6u' at row 1
  199. Warning 1366 Incorrect integer value: 'String 10 ' for column 'v10' at row 1
  200. Warning 1366 Incorrect integer value: 'String10' for column 'v11' at row 1
  201. Warning 1265 Data truncated for column 'v12' at row 1
  202. Warning 1265 Data truncated for column 'v13' at row 1
  203. Warning 1366 Incorrect integer value: 'Hello, world' for column 'v16' at row 1
  204. Note 1265 Data truncated for column 'v18' at row 1
  205. Note 1265 Data truncated for column 'v20' at row 1
  206. CALL sp_vars_check_assignment();
  207. i1 i2 i3 i4
  208. 127 -128 127 -128
  209. i1 i2 i3 i4
  210. 127 -128 127 127
  211. u1 u2 u3 u4
  212. 255 0 255 0
  213. u1 u2 u3 u4
  214. 255 0 200 200
  215. d1 d2 d3
  216. 1234.00 1234.12 1234.12
  217. d1 d2 d3
  218. 1234.00 1234.12 1234.12
  219. Warnings:
  220. Warning 1264 Out of range value adjusted for column 'i1' at row 1
  221. Warning 1264 Out of range value adjusted for column 'i2' at row 1
  222. Warning 1264 Out of range value adjusted for column 'i3' at row 1
  223. Warning 1264 Out of range value adjusted for column 'i4' at row 1
  224. Warning 1264 Out of range value adjusted for column 'i1' at row 1
  225. Warning 1264 Out of range value adjusted for column 'i2' at row 1
  226. Warning 1264 Out of range value adjusted for column 'i3' at row 1
  227. Warning 1264 Out of range value adjusted for column 'i4' at row 1
  228. Warning 1264 Out of range value adjusted for column 'u1' at row 1
  229. Warning 1264 Out of range value adjusted for column 'u2' at row 1
  230. Warning 1264 Out of range value adjusted for column 'u3' at row 1
  231. Warning 1264 Out of range value adjusted for column 'u4' at row 1
  232. Warning 1264 Out of range value adjusted for column 'u1' at row 1
  233. Warning 1264 Out of range value adjusted for column 'u2' at row 1
  234. Note 1265 Data truncated for column 'd3' at row 1
  235. Note 1265 Data truncated for column 'd3' at row 1
  236. SELECT sp_vars_check_ret1();
  237. sp_vars_check_ret1()
  238. 127
  239. Warnings:
  240. Warning 1264 Out of range value adjusted for column 'sp_vars_check_ret1()' at row 1
  241. SELECT sp_vars_check_ret2();
  242. sp_vars_check_ret2()
  243. 127
  244. Warnings:
  245. Warning 1264 Out of range value adjusted for column 'sp_vars_check_ret2()' at row 1
  246. SELECT sp_vars_check_ret3();
  247. sp_vars_check_ret3()
  248. 0
  249. Warnings:
  250. Warning 1366 Incorrect integer value: 'Hello, world' for column 'sp_vars_check_ret3()' at row 1
  251. SELECT sp_vars_check_ret4();
  252. sp_vars_check_ret4()
  253. 154.12
  254. Warnings:
  255. Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
  256. DROP PROCEDURE sp_vars_check_dflt;
  257. DROP PROCEDURE sp_vars_check_assignment;
  258. DROP FUNCTION sp_vars_check_ret1;
  259. DROP FUNCTION sp_vars_check_ret2;
  260. DROP FUNCTION sp_vars_check_ret3;
  261. DROP FUNCTION sp_vars_check_ret4;
  262. CREATE PROCEDURE sp_vars_check_dflt()
  263. BEGIN
  264. DECLARE v1 TINYINT DEFAULT 1e200;
  265. DECLARE v1u TINYINT UNSIGNED DEFAULT 1e200;
  266. DECLARE v2 TINYINT DEFAULT -1e200;
  267. DECLARE v2u TINYINT UNSIGNED DEFAULT -1e200;
  268. DECLARE v3 TINYINT DEFAULT 300;
  269. DECLARE v3u TINYINT UNSIGNED DEFAULT 300;
  270. DECLARE v4 TINYINT DEFAULT -300;
  271. DECLARE v4u TINYINT UNSIGNED DEFAULT -300;
  272. DECLARE v5 TINYINT DEFAULT 10 * 10 * 10;
  273. DECLARE v5u TINYINT UNSIGNED DEFAULT 10 * 10 * 10;
  274. DECLARE v6 TINYINT DEFAULT -10 * 10 * 10;
  275. DECLARE v6u TINYINT UNSIGNED DEFAULT -10 * 10 * 10;
  276. DECLARE v7 TINYINT DEFAULT '10';
  277. DECLARE v8 TINYINT DEFAULT '10 ';
  278. DECLARE v9 TINYINT DEFAULT ' 10 ';
  279. DECLARE v10 TINYINT DEFAULT 'String 10 ';
  280. DECLARE v11 TINYINT DEFAULT 'String10';
  281. DECLARE v12 TINYINT DEFAULT '10 String';
  282. DECLARE v13 TINYINT DEFAULT '10String';
  283. DECLARE v14 TINYINT DEFAULT concat('10', ' ');
  284. DECLARE v15 TINYINT DEFAULT concat(' ', '10');
  285. DECLARE v16 TINYINT DEFAULT concat('Hello, ', 'world');
  286. DECLARE v17 DECIMAL(64, 2) DEFAULT 12;
  287. DECLARE v18 DECIMAL(64, 2) DEFAULT 12.123;
  288. DECLARE v19 DECIMAL(64, 2) DEFAULT 11 + 1;
  289. DECLARE v20 DECIMAL(64, 2) DEFAULT 12 + 0.123;
  290. SELECT v1, v1u, v2, v2u, v3, v3u, v4, v4u;
  291. SELECT v5, v5u, v6, v6u;
  292. SELECT v7, v8, v9, v10, v11, v12, v13, v14, v15, v16;
  293. SELECT v17, v18, v19, v20;
  294. END|
  295. CREATE PROCEDURE sp_vars_check_assignment()
  296. BEGIN
  297. DECLARE i1, i2, i3, i4 TINYINT;
  298. DECLARE u1, u2, u3, u4 TINYINT UNSIGNED;
  299. DECLARE d1, d2, d3 DECIMAL(64, 2);
  300. SET i1 = 1e200;
  301. SET i2 = -1e200;
  302. SET i3 = 300;
  303. SET i4 = -300;
  304. SELECT i1, i2, i3, i4;
  305. SET i1 = 10 * 10 * 10;
  306. SET i2 = -10 * 10 * 10;
  307. SET i3 = sign(10 * 10) * 10 * 20;
  308. SET i4 = sign(-10 * 10) * -10 * 20;
  309. SELECT i1, i2, i3, i4;
  310. SET u1 = 1e200;
  311. SET u2 = -1e200;
  312. SET u3 = 300;
  313. SET u4 = -300;
  314. SELECT u1, u2, u3, u4;
  315. SET u1 = 10 * 10 * 10;
  316. SET u2 = -10 * 10 * 10;
  317. SET u3 = sign(10 * 10) * 10 * 20;
  318. SET u4 = sign(-10 * 10) * -10 * 20;
  319. SELECT u1, u2, u3, u4;
  320. SET d1 = 1234;
  321. SET d2 = 1234.12;
  322. SET d3 = 1234.1234;
  323. SELECT d1, d2, d3;
  324. SET d1 = 12 * 100 + 34;
  325. SET d2 = 12 * 100 + 34 + 0.12;
  326. SET d3 = 12 * 100 + 34 + 0.1234;
  327. SELECT d1, d2, d3;
  328. END|
  329. CREATE FUNCTION sp_vars_check_ret1() RETURNS TINYINT
  330. BEGIN
  331. RETURN 1e200;
  332. END|
  333. CREATE FUNCTION sp_vars_check_ret2() RETURNS TINYINT
  334. BEGIN
  335. RETURN 10 * 10 * 10;
  336. END|
  337. CREATE FUNCTION sp_vars_check_ret3() RETURNS TINYINT
  338. BEGIN
  339. RETURN 'Hello, world';
  340. END|
  341. CREATE FUNCTION sp_vars_check_ret4() RETURNS DECIMAL(64, 2)
  342. BEGIN
  343. RETURN 12 * 10 + 34 + 0.1234;
  344. END|
  345. ---------------------------------------------------------------
  346. Calling the routines, created in TRADITIONAL mode.
  347. ---------------------------------------------------------------
  348. CALL sp_vars_check_dflt();
  349. ERROR 22003: Out of range value adjusted for column 'v1' at row 1
  350. CALL sp_vars_check_assignment();
  351. ERROR 22003: Out of range value adjusted for column 'i1' at row 1
  352. SELECT sp_vars_check_ret1();
  353. ERROR 22003: Out of range value adjusted for column 'sp_vars_check_ret1()' at row 1
  354. SELECT sp_vars_check_ret2();
  355. ERROR 22003: Out of range value adjusted for column 'sp_vars_check_ret2()' at row 1
  356. SELECT sp_vars_check_ret3();
  357. ERROR HY000: Incorrect integer value: 'Hello, world' for column 'sp_vars_check_ret3()' at row 1
  358. SELECT sp_vars_check_ret4();
  359. sp_vars_check_ret4()
  360. 154.12
  361. Warnings:
  362. Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
  363. SET @@sql_mode = 'ansi';
  364. DROP PROCEDURE sp_vars_check_dflt;
  365. DROP PROCEDURE sp_vars_check_assignment;
  366. DROP FUNCTION sp_vars_check_ret1;
  367. DROP FUNCTION sp_vars_check_ret2;
  368. DROP FUNCTION sp_vars_check_ret3;
  369. DROP FUNCTION sp_vars_check_ret4;
  370. ---------------------------------------------------------------
  371. BIT data type tests
  372. ---------------------------------------------------------------
  373. DROP PROCEDURE IF EXISTS p1;
  374. CREATE PROCEDURE p1()
  375. BEGIN
  376. DECLARE v1 BIT;
  377. DECLARE v2 BIT(1);
  378. DECLARE v3 BIT(3) DEFAULT b'101';
  379. DECLARE v4 BIT(64) DEFAULT 0x5555555555555555;
  380. DECLARE v5 BIT(3);
  381. DECLARE v6 BIT(64);
  382. DECLARE v7 BIT(8) DEFAULT 128;
  383. DECLARE v8 BIT(8) DEFAULT '128';
  384. DECLARE v9 BIT(8) DEFAULT ' 128';
  385. DECLARE v10 BIT(8) DEFAULT 'x 128';
  386. SET v1 = v4;
  387. SET v2 = 0;
  388. SET v5 = v4; # check overflow
  389. SET v6 = v3; # check padding
  390. SELECT HEX(v1);
  391. SELECT HEX(v2);
  392. SELECT HEX(v3);
  393. SELECT HEX(v4);
  394. SELECT HEX(v5);
  395. SELECT HEX(v6);
  396. SELECT HEX(v7);
  397. SELECT HEX(v8);
  398. SELECT HEX(v9);
  399. SELECT HEX(v10);
  400. END|
  401. CALL p1();
  402. HEX(v1)
  403. 01
  404. HEX(v2)
  405. 00
  406. HEX(v3)
  407. 05
  408. HEX(v4)
  409. 5555555555555555
  410. HEX(v5)
  411. 07
  412. HEX(v6)
  413. 0000000000000005
  414. HEX(v7)
  415. 80
  416. HEX(v8)
  417. FF
  418. HEX(v9)
  419. FF
  420. HEX(v10)
  421. FF
  422. Warnings:
  423. Warning 1264 Out of range value adjusted for column 'v8' at row 1
  424. Warning 1264 Out of range value adjusted for column 'v9' at row 1
  425. Warning 1264 Out of range value adjusted for column 'v10' at row 1
  426. Warning 1264 Out of range value adjusted for column 'v1' at row 1
  427. Warning 1264 Out of range value adjusted for column 'v5' at row 1
  428. DROP PROCEDURE p1;
  429. ---------------------------------------------------------------
  430. CASE expression tests.
  431. ---------------------------------------------------------------
  432. DROP PROCEDURE IF EXISTS p1;
  433. Warnings:
  434. Note 1305 PROCEDURE p1 does not exist
  435. DROP PROCEDURE IF EXISTS p2;
  436. Warnings:
  437. Note 1305 PROCEDURE p2 does not exist
  438. DROP TABLE IF EXISTS t1;
  439. Warnings:
  440. Note 1051 Unknown table 't1'
  441. CREATE TABLE t1(log_msg VARCHAR(1024));
  442. CREATE PROCEDURE p1(arg VARCHAR(255))
  443. BEGIN
  444. INSERT INTO t1 VALUES('p1: step1');
  445. CASE arg * 10
  446. WHEN 10 * 10 THEN
  447. INSERT INTO t1 VALUES('p1: case1: on 10');
  448. WHEN 10 * 10 + 10 * 10 THEN
  449. BEGIN
  450. CASE arg / 10
  451. WHEN 1 THEN
  452. INSERT INTO t1 VALUES('p1: case1: case2: on 1');
  453. WHEN 2 THEN
  454. BEGIN
  455. DECLARE i TINYINT DEFAULT 10;
  456. WHILE i > 0 DO
  457. INSERT INTO t1 VALUES(CONCAT('p1: case1: case2: loop: i: ', i));
  458. CASE MOD(i, 2)
  459. WHEN 0 THEN
  460. INSERT INTO t1 VALUES('p1: case1: case2: loop: i is even');
  461. WHEN 1 THEN
  462. INSERT INTO t1 VALUES('p1: case1: case2: loop: i is odd');
  463. ELSE
  464. INSERT INTO t1 VALUES('p1: case1: case2: loop: ERROR');
  465. END CASE;
  466. SET i = i - 1;
  467. END WHILE;
  468. END;
  469. ELSE
  470. INSERT INTO t1 VALUES('p1: case1: case2: ERROR');
  471. END CASE;
  472. CASE arg
  473. WHEN 10 THEN
  474. INSERT INTO t1 VALUES('p1: case1: case3: on 10');
  475. WHEN 20 THEN
  476. INSERT INTO t1 VALUES('p1: case1: case3: on 20');
  477. ELSE
  478. INSERT INTO t1 VALUES('p1: case1: case3: ERROR');
  479. END CASE;
  480. END;
  481. ELSE
  482. INSERT INTO t1 VALUES('p1: case1: ERROR');
  483. END CASE;
  484. CASE arg * 10
  485. WHEN 10 * 10 THEN
  486. INSERT INTO t1 VALUES('p1: case4: on 10');
  487. WHEN 10 * 10 + 10 * 10 THEN
  488. BEGIN
  489. CASE arg / 10
  490. WHEN 1 THEN
  491. INSERT INTO t1 VALUES('p1: case4: case5: on 1');
  492. WHEN 2 THEN
  493. BEGIN
  494. DECLARE i TINYINT DEFAULT 10;
  495. WHILE i > 0 DO
  496. INSERT INTO t1 VALUES(CONCAT('p1: case4: case5: loop: i: ', i));
  497. CASE MOD(i, 2)
  498. WHEN 0 THEN
  499. INSERT INTO t1 VALUES('p1: case4: case5: loop: i is even');
  500. WHEN 1 THEN
  501. INSERT INTO t1 VALUES('p1: case4: case5: loop: i is odd');
  502. ELSE
  503. INSERT INTO t1 VALUES('p1: case4: case5: loop: ERROR');
  504. END CASE;
  505. SET i = i - 1;
  506. END WHILE;
  507. END;
  508. ELSE
  509. INSERT INTO t1 VALUES('p1: case4: case5: ERROR');
  510. END CASE;
  511. CASE arg
  512. WHEN 10 THEN
  513. INSERT INTO t1 VALUES('p1: case4: case6: on 10');
  514. WHEN 20 THEN
  515. INSERT INTO t1 VALUES('p1: case4: case6: on 20');
  516. ELSE
  517. INSERT INTO t1 VALUES('p1: case4: case6: ERROR');
  518. END CASE;
  519. END;
  520. ELSE
  521. INSERT INTO t1 VALUES('p1: case4: ERROR');
  522. END CASE;
  523. END|
  524. CREATE PROCEDURE p2()
  525. BEGIN
  526. DECLARE i TINYINT DEFAULT 3;
  527. WHILE i > 0 DO
  528. IF MOD(i, 2) = 0 THEN
  529. SET @_test_session_var = 10;
  530. ELSE
  531. SET @_test_session_var = 'test';
  532. END IF;
  533. CASE @_test_session_var
  534. WHEN 10 THEN
  535. INSERT INTO t1 VALUES('p2: case: numerical type');
  536. WHEN 'test' THEN
  537. INSERT INTO t1 VALUES('p2: case: string type');
  538. ELSE
  539. INSERT INTO t1 VALUES('p2: case: ERROR');
  540. END CASE;
  541. SET i = i - 1;
  542. END WHILE;
  543. END|
  544. CALL p1(10);
  545. CALL p1(20);
  546. CALL p2();
  547. SELECT * FROM t1;
  548. log_msg
  549. p1: step1
  550. p1: case1: on 10
  551. p1: case4: on 10
  552. p1: step1
  553. p1: case1: case2: loop: i: 10
  554. p1: case1: case2: loop: i is even
  555. p1: case1: case2: loop: i: 9
  556. p1: case1: case2: loop: i is odd
  557. p1: case1: case2: loop: i: 8
  558. p1: case1: case2: loop: i is even
  559. p1: case1: case2: loop: i: 7
  560. p1: case1: case2: loop: i is odd
  561. p1: case1: case2: loop: i: 6
  562. p1: case1: case2: loop: i is even
  563. p1: case1: case2: loop: i: 5
  564. p1: case1: case2: loop: i is odd
  565. p1: case1: case2: loop: i: 4
  566. p1: case1: case2: loop: i is even
  567. p1: case1: case2: loop: i: 3
  568. p1: case1: case2: loop: i is odd
  569. p1: case1: case2: loop: i: 2
  570. p1: case1: case2: loop: i is even
  571. p1: case1: case2: loop: i: 1
  572. p1: case1: case2: loop: i is odd
  573. p1: case1: case3: on 20
  574. p1: case4: case5: loop: i: 10
  575. p1: case4: case5: loop: i is even
  576. p1: case4: case5: loop: i: 9
  577. p1: case4: case5: loop: i is odd
  578. p1: case4: case5: loop: i: 8
  579. p1: case4: case5: loop: i is even
  580. p1: case4: case5: loop: i: 7
  581. p1: case4: case5: loop: i is odd
  582. p1: case4: case5: loop: i: 6
  583. p1: case4: case5: loop: i is even
  584. p1: case4: case5: loop: i: 5
  585. p1: case4: case5: loop: i is odd
  586. p1: case4: case5: loop: i: 4
  587. p1: case4: case5: loop: i is even
  588. p1: case4: case5: loop: i: 3
  589. p1: case4: case5: loop: i is odd
  590. p1: case4: case5: loop: i: 2
  591. p1: case4: case5: loop: i is even
  592. p1: case4: case5: loop: i: 1
  593. p1: case4: case5: loop: i is odd
  594. p1: case4: case6: on 20
  595. p2: case: string type
  596. p2: case: numerical type
  597. p2: case: string type
  598. DROP PROCEDURE p1;
  599. DROP PROCEDURE p2;
  600. DROP TABLE t1;
  601. ---------------------------------------------------------------
  602. BUG#14161
  603. ---------------------------------------------------------------
  604. DROP TABLE IF EXISTS t1;
  605. DROP PROCEDURE IF EXISTS p1;
  606. CREATE TABLE t1(col BIGINT UNSIGNED);
  607. INSERT INTO t1 VALUE(18446744073709551614);
  608. CREATE PROCEDURE p1(IN arg BIGINT UNSIGNED)
  609. BEGIN
  610. SELECT arg;
  611. SELECT * FROM t1;
  612. SELECT * FROM t1 WHERE col = arg;
  613. END|
  614. CALL p1(18446744073709551614);
  615. arg
  616. 18446744073709551614
  617. col
  618. 18446744073709551614
  619. col
  620. 18446744073709551614
  621. DROP TABLE t1;
  622. DROP PROCEDURE p1;
  623. ---------------------------------------------------------------
  624. BUG#13705
  625. ---------------------------------------------------------------
  626. DROP PROCEDURE IF EXISTS p1;
  627. CREATE PROCEDURE p1(x VARCHAR(10), y CHAR(3)) READS SQL DATA
  628. BEGIN
  629. SELECT x, y;
  630. END|
  631. CALL p1('alpha', 'abc');
  632. x y
  633. alpha abc
  634. CALL p1('alpha', 'abcdef');
  635. x y
  636. alpha abc
  637. Warnings:
  638. Warning 1265 Data truncated for column 'y' at row 1
  639. DROP PROCEDURE p1;
  640. ---------------------------------------------------------------
  641. BUG#13675
  642. ---------------------------------------------------------------
  643. DROP PROCEDURE IF EXISTS p1;
  644. DROP TABLE IF EXISTS t1;
  645. CREATE PROCEDURE p1(x DATETIME)
  646. BEGIN
  647. CREATE TABLE t1 SELECT x;
  648. SHOW CREATE TABLE t1;
  649. DROP TABLE t1;
  650. END|
  651. CALL p1(NOW());
  652. Table Create Table
  653. t1 CREATE TABLE "t1" (
  654. "x" varbinary(19) default NULL
  655. )
  656. CALL p1('test');
  657. Table Create Table
  658. t1 CREATE TABLE "t1" (
  659. "x" varbinary(19) default NULL
  660. )
  661. Warnings:
  662. Warning 1264 Out of range value adjusted for column 'x' at row 1
  663. DROP PROCEDURE p1;
  664. ---------------------------------------------------------------
  665. BUG#12976
  666. ---------------------------------------------------------------
  667. DROP TABLE IF EXISTS t1;
  668. DROP PROCEDURE IF EXISTS p1;
  669. DROP PROCEDURE IF EXISTS p2;
  670. CREATE TABLE t1(b BIT(1));
  671. INSERT INTO t1(b) VALUES(b'0'), (b'1');
  672. CREATE PROCEDURE p1()
  673. BEGIN
  674. SELECT HEX(b),
  675. b = 0,
  676. b = FALSE,
  677. b IS FALSE,
  678. b = 1,
  679. b = TRUE,
  680. b IS TRUE
  681. FROM t1;
  682. END|
  683. CREATE PROCEDURE p2()
  684. BEGIN
  685. DECLARE vb BIT(1);
  686. SELECT b INTO vb FROM t1 WHERE b = 0;
  687. SELECT HEX(vb),
  688. vb = 0,
  689. vb = FALSE,
  690. vb IS FALSE,
  691. vb = 1,
  692. vb = TRUE,
  693. vb IS TRUE;
  694. SELECT b INTO vb FROM t1 WHERE b = 1;
  695. SELECT HEX(vb),
  696. vb = 0,
  697. vb = FALSE,
  698. vb IS FALSE,
  699. vb = 1,
  700. vb = TRUE,
  701. vb IS TRUE;
  702. END|
  703. call p1();
  704. HEX(b) b = 0 b = FALSE b IS FALSE b = 1 b = TRUE b IS TRUE
  705. 0 1 1 1 0 0 0
  706. 1 0 0 0 1 1 1
  707. call p2();
  708. HEX(vb) vb = 0 vb = FALSE vb IS FALSE vb = 1 vb = TRUE vb IS TRUE
  709. 00 1 1 1 0 0 0
  710. HEX(vb) vb = 0 vb = FALSE vb IS FALSE vb = 1 vb = TRUE vb IS TRUE
  711. 01 0 0 1 1 1 0
  712. DROP TABLE t1;
  713. DROP PROCEDURE p1;
  714. DROP PROCEDURE p2;
  715. ---------------------------------------------------------------
  716. BUG#9572
  717. ---------------------------------------------------------------
  718. DROP PROCEDURE IF EXISTS p1;
  719. DROP PROCEDURE IF EXISTS p2;
  720. DROP PROCEDURE IF EXISTS p3;
  721. DROP PROCEDURE IF EXISTS p4;
  722. DROP PROCEDURE IF EXISTS p5;
  723. DROP PROCEDURE IF EXISTS p6;
  724. SET @@sql_mode = 'traditional';
  725. CREATE PROCEDURE p1()
  726. BEGIN
  727. DECLARE v TINYINT DEFAULT 1e200;
  728. SELECT v;
  729. END|
  730. CREATE PROCEDURE p2()
  731. BEGIN
  732. DECLARE v DECIMAL(5) DEFAULT 1e200;
  733. SELECT v;
  734. END|
  735. CREATE PROCEDURE p3()
  736. BEGIN
  737. DECLARE v CHAR(5) DEFAULT 'abcdef';
  738. SELECT v LIKE 'abc___';
  739. END|
  740. CREATE PROCEDURE p4(arg VARCHAR(2))
  741. BEGIN
  742. DECLARE var VARCHAR(1);
  743. SET var := arg;
  744. SELECT arg, var;
  745. END|
  746. CREATE PROCEDURE p5(arg CHAR(2))
  747. BEGIN
  748. DECLARE var CHAR(1);
  749. SET var := arg;
  750. SELECT arg, var;
  751. END|
  752. CREATE PROCEDURE p6(arg DECIMAL(2))
  753. BEGIN
  754. DECLARE var DECIMAL(1);
  755. SET var := arg;
  756. SELECT arg, var;
  757. END|
  758. CALL p1();
  759. ERROR 22003: Out of range value adjusted for column 'v' at row 1
  760. CALL p2();
  761. ERROR 22003: Out of range value adjusted for column 'v' at row 1
  762. CALL p3();
  763. ERROR 22001: Data too long for column 'v' at row 1
  764. CALL p4('aaa');
  765. ERROR 22001: Data too long for column 'arg' at row 1
  766. CALL p5('aa');
  767. ERROR 22001: Data too long for column 'var' at row 1
  768. CALL p6(10);
  769. ERROR 22003: Out of range value adjusted for column 'var' at row 1
  770. SET @@sql_mode = 'ansi';
  771. DROP PROCEDURE p1;
  772. DROP PROCEDURE p2;
  773. DROP PROCEDURE p3;
  774. DROP PROCEDURE p4;
  775. DROP PROCEDURE p5;
  776. DROP PROCEDURE p6;
  777. ---------------------------------------------------------------
  778. BUG#9078
  779. ---------------------------------------------------------------
  780. DROP PROCEDURE IF EXISTS p1;
  781. CREATE PROCEDURE p1 (arg DECIMAL(64,2))
  782. BEGIN
  783. DECLARE var DECIMAL(64,2);
  784. SET var = arg;
  785. SELECT var;
  786. END|
  787. CALL p1(1929);
  788. var
  789. 1929.00
  790. CALL p1(1929.00);
  791. var
  792. 1929.00
  793. CALL p1(1929.003);
  794. var
  795. 1929.00
  796. Warnings:
  797. Note 1265 Data truncated for column 'arg' at row 1
  798. DROP PROCEDURE p1;
  799. ---------------------------------------------------------------
  800. BUG#8768
  801. ---------------------------------------------------------------
  802. DROP FUNCTION IF EXISTS f1;
  803. CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
  804. BEGIN
  805. RETURN arg;
  806. END|
  807. SELECT f1(-2500);
  808. f1(-2500)
  809. 0
  810. Warnings:
  811. Warning 1264 Out of range value adjusted for column 'arg' at row 1
  812. SET @@sql_mode = 'traditional';
  813. SELECT f1(-2500);
  814. ERROR 22003: Out of range value adjusted for column 'arg' at row 1
  815. DROP FUNCTION f1;
  816. CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
  817. BEGIN
  818. RETURN arg;
  819. END|
  820. SELECT f1(-2500);
  821. ERROR 22003: Out of range value adjusted for column 'arg' at row 1
  822. SET @@sql_mode = 'ansi';
  823. DROP FUNCTION f1;
  824. ---------------------------------------------------------------
  825. BUG#8769
  826. ---------------------------------------------------------------
  827. DROP FUNCTION IF EXISTS f1;
  828. CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
  829. BEGIN
  830. RETURN arg;
  831. END|
  832. SELECT f1(8388699);
  833. f1(8388699)
  834. 8388607
  835. Warnings:
  836. Warning 1264 Out of range value adjusted for column 'arg' at row 1
  837. SET @@sql_mode = 'traditional';
  838. SELECT f1(8388699);
  839. ERROR 22003: Out of range value adjusted for column 'arg' at row 1
  840. DROP FUNCTION f1;
  841. CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
  842. BEGIN
  843. RETURN arg;
  844. END|
  845. SELECT f1(8388699);
  846. ERROR 22003: Out of range value adjusted for column 'arg' at row 1
  847. SET @@sql_mode = 'ansi';
  848. DROP FUNCTION f1;
  849. ---------------------------------------------------------------
  850. BUG#8702
  851. ---------------------------------------------------------------
  852. DROP PROCEDURE IF EXISTS p1;
  853. DROP TABLE IF EXISTS t1;
  854. CREATE TABLE t1(col VARCHAR(255));
  855. INSERT INTO t1(col) VALUES('Hello, world!');
  856. CREATE PROCEDURE p1()
  857. BEGIN
  858. DECLARE sp_var INTEGER;
  859. SELECT col INTO sp_var FROM t1 LIMIT 1;
  860. SET @user_var = sp_var;
  861. SELECT sp_var;
  862. SELECT @user_var;
  863. END|
  864. CALL p1();
  865. sp_var
  866. 0
  867. @user_var
  868. 0
  869. Warnings:
  870. Warning 1264 Out of range value adjusted for column 'sp_var' at row 1
  871. DROP PROCEDURE p1;
  872. DROP TABLE t1;
  873. ---------------------------------------------------------------
  874. BUG#12903
  875. ---------------------------------------------------------------
  876. DROP FUNCTION IF EXISTS f1;
  877. DROP TABLE IF EXISTS t1;
  878. CREATE TABLE t1(txt VARCHAR(255));
  879. CREATE FUNCTION f1(arg VARCHAR(255)) RETURNS VARCHAR(255)
  880. BEGIN
  881. DECLARE v1 VARCHAR(255);
  882. DECLARE v2 VARCHAR(255);
  883. SET v1 = CONCAT(LOWER(arg), UPPER(arg));
  884. SET v2 = CONCAT(LOWER(v1), UPPER(v1));
  885. INSERT INTO t1 VALUES(v1), (v2);
  886. RETURN CONCAT(LOWER(arg), UPPER(arg));
  887. END|
  888. SELECT f1('_aBcDe_');
  889. f1('_aBcDe_')
  890. _abcde__ABCDE_
  891. SELECT * FROM t1;
  892. txt
  893. _abcde__ABCDE_
  894. _abcde__abcde__ABCDE__ABCDE_
  895. DROP FUNCTION f1;
  896. DROP TABLE t1;
  897. ---------------------------------------------------------------
  898. BUG#13808
  899. ---------------------------------------------------------------
  900. DROP PROCEDURE IF EXISTS p1;
  901. DROP PROCEDURE IF EXISTS p2;
  902. DROP FUNCTION IF EXISTS f1;
  903. CREATE PROCEDURE p1(arg ENUM('a', 'b'))
  904. BEGIN
  905. SELECT arg;
  906. END|
  907. CREATE PROCEDURE p2(arg ENUM('a', 'b'))
  908. BEGIN
  909. DECLARE var ENUM('c', 'd') DEFAULT arg;
  910. SELECT arg, var;
  911. END|
  912. CREATE FUNCTION f1(arg ENUM('a', 'b')) RETURNS ENUM('c', 'd')
  913. BEGIN
  914. RETURN arg;
  915. END|
  916. CALL p1('c');
  917. arg
  918. Warnings:
  919. Warning 1265 Data truncated for column 'arg' at row 1
  920. CALL p2('a');
  921. arg var
  922. a
  923. Warnings:
  924. Warning 1265 Data truncated for column 'var' at row 1
  925. SELECT f1('a');
  926. f1('a')
  927. Warnings:
  928. Warning 1265 Data truncated for column 'f1('a')' at row 1
  929. DROP PROCEDURE p1;
  930. DROP PROCEDURE p2;
  931. DROP FUNCTION f1;
  932. ---------------------------------------------------------------
  933. BUG#13909
  934. ---------------------------------------------------------------
  935. DROP PROCEDURE IF EXISTS p1;
  936. DROP PROCEDURE IF EXISTS p2;
  937. CREATE PROCEDURE p1(arg VARCHAR(255))
  938. BEGIN
  939. SELECT CHARSET(arg);
  940. END|
  941. CREATE PROCEDURE p2(arg VARCHAR(255) CHARACTER SET UTF8)
  942. BEGIN
  943. SELECT CHARSET(arg);
  944. END|
  945. CALL p1('t');
  946. CHARSET(arg)
  947. latin1
  948. CALL p1(_UTF8 't');
  949. CHARSET(arg)
  950. latin1
  951. CALL p2('t');
  952. CHARSET(arg)
  953. utf8
  954. CALL p2(_LATIN1 't');
  955. CHARSET(arg)
  956. utf8
  957. DROP PROCEDURE p1;
  958. DROP PROCEDURE p2;
  959. ---------------------------------------------------------------
  960. BUG#14188
  961. ---------------------------------------------------------------
  962. DROP PROCEDURE IF EXISTS p1;
  963. CREATE PROCEDURE p1(arg1 BINARY(2), arg2 VARBINARY(2))
  964. BEGIN
  965. DECLARE var1 BINARY(2) DEFAULT 0x41;
  966. DECLARE var2 VARBINARY(2) DEFAULT 0x42;
  967. SELECT HEX(arg1), HEX(arg2);
  968. SELECT HEX(var1), HEX(var2);
  969. END|
  970. CALL p1(0x41, 0x42);
  971. HEX(arg1) HEX(arg2)
  972. 4100 42
  973. HEX(var1) HEX(var2)
  974. 4100 42
  975. DROP PROCEDURE p1;
  976. ---------------------------------------------------------------
  977. BUG#15148
  978. ---------------------------------------------------------------
  979. DROP PROCEDURE IF EXISTS p1;
  980. DROP TABLE IF EXISTS t1;
  981. CREATE TABLE t1(col1 TINYINT, col2 TINYINT);
  982. INSERT INTO t1 VALUES(1, 2), (11, 12);
  983. CREATE PROCEDURE p1(arg TINYINT)
  984. BEGIN
  985. SELECT arg;
  986. END|
  987. CALL p1((1, 2));
  988. ERROR 21000: Operand should contain 1 column(s)
  989. CALL p1((SELECT * FROM t1 LIMIT 1));
  990. ERROR 21000: Operand should contain 1 column(s)
  991. CALL p1((SELECT col1, col2 FROM t1 LIMIT 1));
  992. ERROR 21000: Operand should contain 1 column(s)
  993. DROP PROCEDURE p1;
  994. DROP TABLE t1;
  995. ---------------------------------------------------------------
  996. BUG#13613
  997. ---------------------------------------------------------------
  998. DROP PROCEDURE IF EXISTS p1;
  999. DROP FUNCTION IF EXISTS f1;
  1000. CREATE PROCEDURE p1(x VARCHAR(50))
  1001. BEGIN
  1002. SET x = SUBSTRING(x, 1, 3);
  1003. SELECT x;
  1004. END|
  1005. CREATE FUNCTION f1(x VARCHAR(50)) RETURNS VARCHAR(50)
  1006. BEGIN
  1007. RETURN SUBSTRING(x, 1, 3);
  1008. END|
  1009. CALL p1('abcdef');
  1010. x
  1011. abc
  1012. SELECT f1('ABCDEF');
  1013. f1('ABCDEF')
  1014. ABC
  1015. DROP PROCEDURE p1;
  1016. DROP FUNCTION f1;
  1017. ---------------------------------------------------------------
  1018. BUG#13665
  1019. ---------------------------------------------------------------
  1020. DROP FUNCTION IF EXISTS f1;
  1021. CREATE FUNCTION f1() RETURNS VARCHAR(20000)
  1022. BEGIN
  1023. DECLARE var VARCHAR(2000);
  1024. SET var = '';
  1025. SET var = CONCAT(var, 'abc');
  1026. SET var = CONCAT(var, '');
  1027. RETURN var;
  1028. END|
  1029. SELECT f1();
  1030. f1()
  1031. abc
  1032. DROP FUNCTION f1;
  1033. DROP PROCEDURE IF EXISTS p1;
  1034. CREATE PROCEDURE p1()
  1035. BEGIN
  1036. DECLARE v_char VARCHAR(255);
  1037. DECLARE v_text TEXT DEFAULT '';
  1038. SET v_char = 'abc';
  1039. SET v_text = v_char;
  1040. SET v_char = 'def';
  1041. SET v_text = concat(v_text, '|', v_char);
  1042. SELECT v_text;
  1043. END|
  1044. CALL p1();
  1045. v_text
  1046. abc|def
  1047. DROP PROCEDURE p1;