oceanbase
1525 строк · 30.3 Кб
1--disable_query_log
2set @@session.explicit_defaults_for_timestamp=off;
3--enable_query_log
4
5#owner: linlin.xll
6#owner group: sql1
7#description: test pl variables
8#tags: pl
9
10--result_format 4
11
12set ob_query_timeout=100000000;
13
14###########################################################################
15#
16# Cleanup.
17#
18###########################################################################
19
20--disable_warnings
21
22# Drop stored routines (if any) for general SP-vars test cases. These routines
23# are created in include/sp-vars.inc file.
24
25DROP PROCEDURE IF EXISTS sp_vars_check_dflt;
26DROP PROCEDURE IF EXISTS sp_vars_check_assignment;
27DROP FUNCTION IF EXISTS sp_vars_check_ret1;
28DROP FUNCTION IF EXISTS sp_vars_check_ret2;
29DROP FUNCTION IF EXISTS sp_vars_check_ret3;
30DROP FUNCTION IF EXISTS sp_vars_check_ret4;
31DROP FUNCTION IF EXISTS sp_vars_div_zero;
32
33--enable_warnings
34
35###########################################################################
36#
37# Some general tests for SP-vars functionality.
38#
39###########################################################################
40
41# Create the procedure in ANSI mode. Check that all necessary warnings are
42# emitted properly.
43
44## SET @@sql_mode = 'ansi';
45## REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI
46## for ansi, oceanbase only support PIPES_AS_CONCAT and ONLY_FULL_GROUP_BY
47set @@sql_mode = "PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY";
48
49--source mysql_test/include/sp-vars.inc
50
51--echo
52--echo ---------------------------------------------------------------
53--echo Calling the routines, created in ANSI mode.
54--echo ---------------------------------------------------------------
55--echo
56
57CALL sp_vars_check_dflt();
58
59CALL sp_vars_check_assignment();
60
61SELECT sp_vars_check_ret1();
62
63SELECT sp_vars_check_ret2();
64
65SELECT sp_vars_check_ret3();
66
67SELECT sp_vars_check_ret4();
68
69SELECT sp_vars_div_zero();
70
71# Check that changing sql_mode after creating a store procedure does not
72# matter.
73
74## SET @@sql_mode = 'traditional';
75## STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
76## for traditional oceanbase only support STRICT_TRANS_TABLES, STRICT_ALL_TABLES
77SET @@sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
78--echo
79--echo ---------------------------------------------------------------
80--echo Calling in TRADITIONAL mode the routines, created in ANSI mode.
81--echo ---------------------------------------------------------------
82--echo
83
84CALL sp_vars_check_dflt();
85
86CALL sp_vars_check_assignment();
87
88SELECT sp_vars_check_ret1();
89
90SELECT sp_vars_check_ret2();
91
92SELECT sp_vars_check_ret3();
93
94SELECT sp_vars_check_ret4();
95
96SELECT sp_vars_div_zero();
97
98# Create the procedure in TRADITIONAL mode. Check that error will be thrown on
99# execution.
100
101DROP PROCEDURE sp_vars_check_dflt;
102DROP PROCEDURE sp_vars_check_assignment;
103DROP FUNCTION sp_vars_check_ret1;
104DROP FUNCTION sp_vars_check_ret2;
105DROP FUNCTION sp_vars_check_ret3;
106DROP FUNCTION sp_vars_check_ret4;
107DROP FUNCTION sp_vars_div_zero;
108
109--source mysql_test/include/sp-vars.inc
110
111--echo
112--echo ---------------------------------------------------------------
113--echo Calling the routines, created in TRADITIONAL mode.
114--echo ---------------------------------------------------------------
115--echo
116
117--error ER_WARN_DATA_OUT_OF_RANGE
118CALL sp_vars_check_dflt();
119
120--error ER_WARN_DATA_OUT_OF_RANGE
121CALL sp_vars_check_assignment();
122
123--error ER_WARN_DATA_OUT_OF_RANGE
124SELECT sp_vars_check_ret1();
125
126--error ER_WARN_DATA_OUT_OF_RANGE
127SELECT sp_vars_check_ret2();
128
129--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
130SELECT sp_vars_check_ret3();
131
132# TODO: Is it an error, that only a warning is emitted here? Check the same
133# behaviour with tables.
134
135SELECT sp_vars_check_ret4();
136
137## --error ER_DIVISION_BY_ZERO
138SELECT sp_vars_div_zero();
139
140## SET @@sql_mode = 'ansi';
141set @@sql_mode = "PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY";
142
143#
144# Cleanup.
145#
146
147DROP PROCEDURE sp_vars_check_dflt;
148DROP PROCEDURE sp_vars_check_assignment;
149DROP FUNCTION sp_vars_check_ret1;
150DROP FUNCTION sp_vars_check_ret2;
151DROP FUNCTION sp_vars_check_ret3;
152DROP FUNCTION sp_vars_check_ret4;
153DROP FUNCTION sp_vars_div_zero;
154
155###########################################################################
156#
157# Tests for BIT data type.
158#
159###########################################################################
160
161--echo
162--echo ---------------------------------------------------------------
163--echo BIT data type tests
164--echo ---------------------------------------------------------------
165--echo
166
167#
168# Prepare.
169#
170
171--disable_warnings
172DROP PROCEDURE IF EXISTS p1;
173--enable_warnings
174
175#
176# Test case.
177#
178
179delimiter |;
180CREATE PROCEDURE p1()
181BEGIN
182DECLARE v1 BIT;
183DECLARE v2 BIT(1);
184DECLARE v3 BIT(3) DEFAULT b'101';
185DECLARE v4 BIT(64) DEFAULT 0x5555555555555555;
186DECLARE v5 BIT(3);
187DECLARE v6 BIT(64);
188DECLARE v7 BIT(8) DEFAULT 128;
189DECLARE v8 BIT(8) DEFAULT '128';
190DECLARE v9 BIT(8) DEFAULT ' 128';
191DECLARE v10 BIT(8) DEFAULT 'x 128';
192
193SET v1 = v4;
194SET v2 = 0;
195SET v5 = v4; # check overflow
196SET v6 = v3; # check padding
197
198SELECT HEX(v1);
199SELECT HEX(v2);
200SELECT HEX(v3);
201SELECT HEX(v4);
202SELECT HEX(v5);
203SELECT HEX(v6);
204SELECT HEX(v7);
205SELECT HEX(v8);
206SELECT HEX(v9);
207SELECT HEX(v10);
208END|
209delimiter ;|
210
211CALL p1();
212
213#
214# Cleanup.
215#
216
217DROP PROCEDURE p1;
218
219###########################################################################
220#
221# Tests for CASE statements functionality:
222# - test for general functionality (scopes, nested cases, CASE in loops);
223# - test that if type of the CASE expression is changed on each iteration,
224# the execution will be correct.
225#
226###########################################################################
227
228--echo
229--echo ---------------------------------------------------------------
230--echo CASE expression tests.
231--echo ---------------------------------------------------------------
232--echo
233
234#
235# Prepare.
236#
237
238--disable_warnings
239DROP PROCEDURE IF EXISTS p1;
240DROP PROCEDURE IF EXISTS p2;
241DROP TABLE IF EXISTS t1;
242--enable_warnings
243
244#
245# Test case.
246#
247## use create time to make the order of log_msg stable
248CREATE TABLE t1(ctime int auto_increment, log_msg VARCHAR(1024));
249
250delimiter |;
251
252CREATE PROCEDURE p1(arg VARCHAR(255))
253BEGIN
254INSERT INTO t1(log_msg) VALUES('p1: step1');
255CASE arg * 10
256WHEN 10 * 10 THEN
257INSERT INTO t1(log_msg) VALUES('p1: case1: on 10');
258WHEN 10 * 10 + 10 * 10 THEN
259BEGIN
260CASE arg / 10
261WHEN 1 THEN
262INSERT INTO t1(log_msg) VALUES('p1: case1: case2: on 1');
263WHEN 2 THEN
264BEGIN
265DECLARE i TINYINT DEFAULT 10;
266
267WHILE i > 0 DO
268INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case1: case2: loop: i: ', i));
269
270CASE MOD(i, 2)
271WHEN 0 THEN
272INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: i is even');
273WHEN 1 THEN
274INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: i is odd');
275ELSE
276INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: ERROR');
277END CASE;
278
279SET i = i - 1;
280END WHILE;
281END;
282ELSE
283INSERT INTO t1(log_msg) VALUES('p1: case1: case2: ERROR');
284END CASE;
285
286CASE arg
287WHEN 10 THEN
288INSERT INTO t1(log_msg) VALUES('p1: case1: case3: on 10');
289WHEN 20 THEN
290INSERT INTO t1(log_msg) VALUES('p1: case1: case3: on 20');
291ELSE
292INSERT INTO t1(log_msg) VALUES('p1: case1: case3: ERROR');
293END CASE;
294END;
295ELSE
296INSERT INTO t1(log_msg) VALUES('p1: case1: ERROR');
297END CASE;
298
299CASE arg * 10
300WHEN 10 * 10 THEN
301INSERT INTO t1(log_msg) VALUES('p1: case4: on 10');
302WHEN 10 * 10 + 10 * 10 THEN
303BEGIN
304CASE arg / 10
305WHEN 1 THEN
306INSERT INTO t1(log_msg) VALUES('p1: case4: case5: on 1');
307WHEN 2 THEN
308BEGIN
309DECLARE i TINYINT DEFAULT 10;
310
311WHILE i > 0 DO
312INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case4: case5: loop: i: ', i));
313
314CASE MOD(i, 2)
315WHEN 0 THEN
316INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: i is even');
317WHEN 1 THEN
318INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: i is odd');
319ELSE
320INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: ERROR');
321END CASE;
322
323SET i = i - 1;
324END WHILE;
325END;
326ELSE
327INSERT INTO t1(log_msg) VALUES('p1: case4: case5: ERROR');
328END CASE;
329
330CASE arg
331WHEN 10 THEN
332INSERT INTO t1(log_msg) VALUES('p1: case4: case6: on 10');
333WHEN 20 THEN
334INSERT INTO t1(log_msg) VALUES('p1: case4: case6: on 20');
335ELSE
336INSERT INTO t1(log_msg) VALUES('p1: case4: case6: ERROR');
337END CASE;
338END;
339ELSE
340INSERT INTO t1(log_msg) VALUES('p1: case4: ERROR');
341END CASE;
342END|
343
344CREATE PROCEDURE p2()
345BEGIN
346DECLARE i TINYINT DEFAULT 3;
347
348WHILE i > 0 DO
349IF MOD(i, 2) = 0 THEN
350SET @_test_session_var = 10;
351ELSE
352SET @_test_session_var = 'test';
353END IF;
354
355CASE @_test_session_var
356WHEN 10 THEN
357INSERT INTO t1(log_msg) VALUES('p2: case: numerical type');
358WHEN 'test' THEN
359INSERT INTO t1(log_msg) VALUES('p2: case: string type');
360ELSE
361INSERT INTO t1(log_msg) VALUES('p2: case: ERROR');
362END CASE;
363
364SET i = i - 1;
365END WHILE;
366END|
367
368delimiter ;|
369
370CALL p1(10);
371CALL p1(20);
372
373CALL p2();
374
375SELECT ctime, log_msg FROM t1 order by ctime, log_msg;
376
377#
378# Cleanup.
379#
380
381DROP PROCEDURE p1;
382DROP PROCEDURE p2;
383DROP TABLE t1;
384
385###########################################################################
386#
387# Test case for BUG#14161: Stored procedure cannot retrieve bigint unsigned.
388#
389###########################################################################
390
391--echo
392--echo ---------------------------------------------------------------
393--echo BUG#14161
394--echo ---------------------------------------------------------------
395--echo
396
397#
398# Prepare.
399#
400
401--disable_warnings
402DROP TABLE IF EXISTS t1;
403DROP PROCEDURE IF EXISTS p1;
404--enable_warnings
405
406#
407# Test case.
408#
409
410CREATE TABLE t1(col BIGINT UNSIGNED);
411
412INSERT INTO t1 VALUE(18446744073709551614);
413
414delimiter |;
415CREATE PROCEDURE p1(IN arg BIGINT UNSIGNED)
416BEGIN
417SELECT arg;
418SELECT * FROM t1;
419SELECT * FROM t1 WHERE col = arg;
420END|
421delimiter ;|
422
423CALL p1(18446744073709551614);
424
425#
426# Cleanup.
427#
428
429DROP TABLE t1;
430DROP PROCEDURE p1;
431
432###########################################################################
433#
434# Test case for BUG#13705: parameters to stored procedures are not verified.
435#
436###########################################################################
437
438--echo
439--echo ---------------------------------------------------------------
440--echo BUG#13705
441--echo ---------------------------------------------------------------
442--echo
443
444#
445# Prepare.
446#
447
448--disable_warnings
449DROP PROCEDURE IF EXISTS p1;
450--enable_warnings
451
452#
453# Test case.
454#
455
456delimiter |;
457CREATE PROCEDURE p1(x VARCHAR(10), y CHAR(3)) READS SQL DATA
458BEGIN
459SELECT x, y;
460END|
461delimiter ;|
462
463CALL p1('alpha', 'abc');
464CALL p1('alpha', 'abcdef');
465
466#
467# Cleanup.
468#
469
470DROP PROCEDURE p1;
471
472###########################################################################
473#
474# Test case for BUG#13675: DATETIME/DATE type in store proc param seems to be
475# converted as varbinary.
476#
477# TODO: test case failed.
478#
479###########################################################################
480
481--echo
482--echo ---------------------------------------------------------------
483--echo BUG#13675
484--echo ---------------------------------------------------------------
485--echo
486
487#
488# Prepare.
489#
490
491## --disable_warnings
492## DROP PROCEDURE IF EXISTS p1;
493## DROP TABLE IF EXISTS t1;
494## --enable_warnings
495
496#
497# Test case.
498#
499## TODO: DDL not support select x with variables
500## delimiter |;
501## CREATE PROCEDURE p1(x DATETIME)
502## BEGIN
503## CREATE TABLE t1 AS SELECT x;
504## SHOW CREATE TABLE t1;
505## DROP TABLE t1;
506## END|
507## delimiter ;|
508##
509## CALL p1(NOW());
510## CALL p1('test');
511
512#
513# Cleanup.
514#
515
516## DROP PROCEDURE p1;
517
518###########################################################################
519#
520# Test case for BUG#12976: Boolean values reversed in stored procedures?
521#
522###########################################################################
523
524--echo
525--echo ---------------------------------------------------------------
526--echo BUG#12976
527--echo ---------------------------------------------------------------
528--echo
529
530#
531# Prepare.
532#
533
534--disable_warnings
535DROP TABLE IF EXISTS t1;
536DROP PROCEDURE IF EXISTS p1;
537DROP PROCEDURE IF EXISTS p2;
538--enable_warnings
539
540#
541# Test case.
542#
543
544CREATE TABLE t1(b BIT(1));
545
546INSERT INTO t1(b) VALUES(b'0'), (b'1');
547
548delimiter |;
549CREATE PROCEDURE p1()
550BEGIN
551SELECT HEX(b),
552b = 0,
553b = FALSE,
554b IS FALSE,
555b = 1,
556b = TRUE,
557b IS TRUE
558FROM t1;
559END|
560
561CREATE PROCEDURE p2()
562BEGIN
563DECLARE vb BIT(1);
564SELECT b FROM t1 WHERE b = 0 INTO vb;
565
566SELECT HEX(vb),
567vb = 0,
568vb = FALSE,
569vb IS FALSE,
570vb = 1,
571vb = TRUE,
572vb IS TRUE;
573
574SELECT b FROM t1 WHERE b = 1 INTO vb;
575
576SELECT HEX(vb),
577vb = 0,
578vb = FALSE,
579vb IS FALSE,
580vb = 1,
581vb = TRUE,
582vb IS TRUE;
583END|
584delimiter ;|
585
586call p1();
587call p2();
588
589#
590# Cleanup.
591#
592
593DROP TABLE t1;
594DROP PROCEDURE p1;
595DROP PROCEDURE p2;
596
597# Additional tests for Bug#12976
598
599--disable_warnings
600DROP TABLE IF EXISTS table_12976_a;
601DROP TABLE IF EXISTS table_12976_b;
602DROP PROCEDURE IF EXISTS proc_12976_a;
603DROP PROCEDURE IF EXISTS proc_12976_b;
604--enable_warnings
605
606CREATE TABLE table_12976_a (val bit(1));
607
608CREATE TABLE table_12976_b(
609appname varchar(15),
610emailperm bit not null default 1,
611phoneperm bit not null default 0);
612
613insert into table_12976_b values ('A', b'1', b'1'), ('B', b'0', b'0');
614
615delimiter ||;
616CREATE PROCEDURE proc_12976_a()
617BEGIN
618declare localvar bit(1);
619SELECT val FROM table_12976_a INTO localvar;
620SELECT coalesce(localvar, 1)+1, coalesce(val, 1)+1 FROM table_12976_a;
621END||
622
623CREATE PROCEDURE proc_12976_b(
624name varchar(15),
625out ep bit,
626out msg varchar(10))
627BEGIN
628SELECT emailperm FROM table_12976_b where (appname = name) INTO ep;
629IF ep is true THEN
630SET msg = 'True';
631ELSE
632SET msg = 'False';
633END IF;
634END||
635
636delimiter ;||
637
638INSERT table_12976_a VALUES (0);
639--disable_warnings
640call proc_12976_a();
641--enable_warnings
642UPDATE table_12976_a set val=1;
643--disable_warnings
644call proc_12976_a();
645--enable_warnings
646
647call proc_12976_b('A', @ep, @msg);
648select HEX(@ep), @msg;
649
650call proc_12976_b('B', @ep, @msg);
651select HEX(@ep), @msg;
652
653DROP TABLE table_12976_a;
654DROP TABLE table_12976_b;
655DROP PROCEDURE proc_12976_a;
656DROP PROCEDURE proc_12976_b;
657
658
659###########################################################################
660#
661# Test case for BUG#9572: Stored procedures: variable type declarations
662# ignored.
663#
664###########################################################################
665
666--echo
667--echo ---------------------------------------------------------------
668--echo BUG#9572
669--echo ---------------------------------------------------------------
670--echo
671
672#
673# Prepare.
674#
675
676--disable_warnings
677DROP PROCEDURE IF EXISTS p1;
678DROP PROCEDURE IF EXISTS p2;
679DROP PROCEDURE IF EXISTS p3;
680
681DROP PROCEDURE IF EXISTS p4;
682DROP PROCEDURE IF EXISTS p5;
683DROP PROCEDURE IF EXISTS p6;
684--enable_warnings
685
686#
687# Test case.
688#
689
690## SET @@sql_mode = 'traditional';
691SET @@sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
692
693delimiter |;
694
695CREATE PROCEDURE p1()
696BEGIN
697DECLARE v TINYINT DEFAULT 1e200;
698SELECT v;
699END|
700
701CREATE PROCEDURE p2()
702BEGIN
703DECLARE v DECIMAL(5) DEFAULT 1e200;
704SELECT v;
705END|
706
707CREATE PROCEDURE p3()
708BEGIN
709DECLARE v CHAR(5) DEFAULT 'abcdef';
710SELECT v LIKE 'abc___';
711END|
712
713CREATE PROCEDURE p4(arg VARCHAR(2))
714BEGIN
715DECLARE var VARCHAR(1);
716SET var := arg;
717SELECT arg, var;
718END|
719
720CREATE PROCEDURE p5(arg CHAR(2))
721BEGIN
722DECLARE var CHAR(1);
723SET var := arg;
724SELECT arg, var;
725END|
726
727CREATE PROCEDURE p6(arg DECIMAL(2))
728BEGIN
729DECLARE var DECIMAL(1);
730SET var := arg;
731SELECT arg, var;
732END|
733
734delimiter ;|
735
736--error ER_WARN_DATA_OUT_OF_RANGE
737CALL p1();
738--error ER_WARN_DATA_OUT_OF_RANGE
739CALL p2();
740--error ER_DATA_TOO_LONG
741CALL p3();
742
743--error ER_DATA_TOO_LONG
744CALL p4('aaa');
745--error ER_DATA_TOO_LONG
746CALL p5('aa');
747--error ER_WARN_DATA_OUT_OF_RANGE
748CALL p6(10);
749
750#
751# Cleanup.
752#
753
754## SET @@sql_mode = 'ansi';
755set @@sql_mode = "PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY";
756
757DROP PROCEDURE p1;
758DROP PROCEDURE p2;
759DROP PROCEDURE p3;
760
761DROP PROCEDURE p4;
762DROP PROCEDURE p5;
763DROP PROCEDURE p6;
764
765###########################################################################
766#
767# Test case for BUG#9078: STORED PROCDURE: Decimal digits are not displayed
768# when we use DECIMAL datatype.
769#
770###########################################################################
771
772--echo
773--echo ---------------------------------------------------------------
774--echo BUG#9078
775--echo ---------------------------------------------------------------
776--echo
777
778#
779# Prepare.
780#
781
782--disable_warnings
783DROP PROCEDURE IF EXISTS p1;
784--enable_warnings
785
786#
787# Test case.
788#
789
790delimiter |;
791CREATE PROCEDURE p1 (arg DECIMAL(64,2))
792BEGIN
793DECLARE var DECIMAL(64,2);
794
795SET var = arg;
796SELECT var;
797END|
798delimiter ;|
799
800CALL p1(1929);
801CALL p1(1929.00);
802CALL p1(1929.003);
803
804#
805# Cleanup.
806#
807
808DROP PROCEDURE p1;
809
810###########################################################################
811#
812# Test case for BUG#8768: Functions: For any unsigned data type, -ve values can
813# be passed and returned.
814#
815# TODO: there is a bug here -- the function created in ANSI mode should not
816# throw errors instead of warnings if called in TRADITIONAL mode.
817#
818###########################################################################
819
820--echo
821--echo ---------------------------------------------------------------
822--echo BUG#8768
823--echo ---------------------------------------------------------------
824--echo
825
826#
827# Prepare.
828#
829
830--disable_warnings
831DROP FUNCTION IF EXISTS f1;
832--enable_warnings
833
834#
835# Test case.
836#
837
838# Create a function in ANSI mode.
839
840delimiter |;
841CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
842BEGIN
843RETURN arg;
844END|
845delimiter ;|
846# mysql8.0 会报错
847--error 1264
848SELECT f1(-2500);
849
850# Call in TRADITIONAL mode the function created in ANSI mode.
851
852## SET @@sql_mode = 'traditional';
853SET @@sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
854
855# TODO: a warning should be emitted here.
856## --error ER_WARN_DATA_OUT_OF_RANGE
857--error 1264
858SELECT f1(-2500);
859
860# Recreate the function in TRADITIONAL mode.
861
862DROP FUNCTION f1;
863
864delimiter |;
865CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
866BEGIN
867RETURN arg;
868END|
869delimiter ;|
870
871## --error ER_WARN_DATA_OUT_OF_RANGE
872--error 1264
873SELECT f1(-2500);
874
875#
876# Cleanup.
877#
878
879## SET @@sql_mode = 'ansi';
880set @@sql_mode = "PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY";
881
882DROP FUNCTION f1;
883
884###########################################################################
885#
886# Test case for BUG#8769: Functions: For Int datatypes, out of range values can
887# be passed and returned.
888#
889# TODO: there is a bug here -- the function created in ANSI mode should not
890# throw errors instead of warnings if called in TRADITIONAL mode.
891#
892###########################################################################
893
894--echo
895--echo ---------------------------------------------------------------
896--echo BUG#8769
897--echo ---------------------------------------------------------------
898--echo
899
900#
901# Prepare.
902#
903
904--disable_warnings
905DROP FUNCTION IF EXISTS f1;
906--enable_warnings
907
908#
909# Test case.
910#
911
912# Create a function in ANSI mode.
913
914delimiter |;
915CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
916BEGIN
917RETURN arg;
918END|
919delimiter ;|
920
921#mysql 8.0报错
922--error 1264
923SELECT f1(8388699);
924
925# Call in TRADITIONAL mode the function created in ANSI mode.
926
927## SET @@sql_mode = 'traditional';
928SET @@sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
929
930# TODO: a warning should be emitted here.
931## --error ER_WARN_DATA_OUT_OF_RANGE
932--error 1264
933SELECT f1(8388699);
934
935# Recreate the function in TRADITIONAL mode.
936
937DROP FUNCTION f1;
938
939delimiter |;
940CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
941BEGIN
942RETURN arg;
943END|
944delimiter ;|
945
946## --error ER_WARN_DATA_OUT_OF_RANGE
947--error 1264
948SELECT f1(8388699);
949
950#
951# Cleanup.
952#
953
954## SET @@sql_mode = 'ansi';
955set @@sql_mode = "PIPES_AS_CONCAT,ONLY_FULL_GROUP_BY";
956
957DROP FUNCTION f1;
958
959###########################################################################
960#
961# Test case for BUG#8702: Stored Procedures: No Error/Warning shown for
962# inappropriate data type matching.
963#
964###########################################################################
965
966--echo
967--echo ---------------------------------------------------------------
968--echo BUG#8702
969--echo ---------------------------------------------------------------
970--echo
971
972#
973# Prepare.
974#
975
976--disable_warnings
977DROP PROCEDURE IF EXISTS p1;
978DROP TABLE IF EXISTS t1;
979--enable_warnings
980
981#
982# Test case.
983#
984
985CREATE TABLE t1(col VARCHAR(255));
986
987INSERT INTO t1(col) VALUES('Hello, world!');
988
989delimiter |;
990CREATE PROCEDURE p1()
991BEGIN
992DECLARE sp_var INTEGER;
993
994SELECT col FROM t1 LIMIT 1 INTO sp_var;
995SET @user_var = sp_var;
996
997SELECT sp_var;
998SELECT @user_var;
999END|
1000delimiter ;|
1001
1002CALL p1();
1003
1004#
1005# Cleanup.
1006#
1007
1008DROP PROCEDURE p1;
1009DROP TABLE t1;
1010
1011###########################################################################
1012#
1013# Test case for BUG#12903: upper function does not work inside a function.
1014#
1015###########################################################################
1016
1017--echo
1018--echo ---------------------------------------------------------------
1019--echo BUG#12903
1020--echo ---------------------------------------------------------------
1021--echo
1022
1023#
1024# Prepare.
1025#
1026
1027--disable_warnings
1028DROP FUNCTION IF EXISTS f1;
1029DROP TABLE IF EXISTS t1;
1030--enable_warnings
1031
1032#
1033# Test case.
1034#
1035
1036CREATE TABLE t1(txt VARCHAR(255));
1037
1038delimiter |;
1039CREATE FUNCTION f1(arg VARCHAR(255)) RETURNS VARCHAR(255)
1040BEGIN
1041DECLARE v1 VARCHAR(255);
1042DECLARE v2 VARCHAR(255);
1043
1044SET v1 = CONCAT(LOWER(arg), UPPER(arg));
1045SET v2 = CONCAT(LOWER(v1), UPPER(v1));
1046
1047INSERT INTO t1 VALUES(v1), (v2);
1048
1049RETURN CONCAT(LOWER(arg), UPPER(arg));
1050END|
1051delimiter ;|
1052
1053SELECT f1('_aBcDe_');
1054
1055SELECT * FROM t1;
1056
1057#
1058# Cleanup.
1059#
1060
1061DROP FUNCTION f1;
1062DROP TABLE t1;
1063
1064###########################################################################
1065#
1066# Test case for BUG#13808: ENUM type stored procedure parameter accepts
1067# non-enumerated data.
1068#
1069###########################################################################
1070
1071## --echo
1072## --echo ---------------------------------------------------------------
1073## --echo BUG#13808
1074## --echo ---------------------------------------------------------------
1075## --echo
1076
1077#
1078# Prepare.
1079#
1080
1081## --disable_warnings
1082## DROP PROCEDURE IF EXISTS p1;
1083## DROP PROCEDURE IF EXISTS p2;
1084## DROP FUNCTION IF EXISTS f1;
1085## --enable_warnings
1086
1087#
1088# Test case.
1089#
1090## delimiter |;
1091##
1092## CREATE PROCEDURE p1(arg ENUM('a', 'b'))
1093## BEGIN
1094## SELECT arg;
1095## END|
1096##
1097## CREATE PROCEDURE p2(arg ENUM('a', 'b'))
1098## BEGIN
1099## DECLARE var ENUM('c', 'd') DEFAULT arg;
1100##
1101## SELECT arg, var;
1102## END|
1103##
1104## CREATE FUNCTION f1(arg ENUM('a', 'b')) RETURNS ENUM('c', 'd')
1105## BEGIN
1106## RETURN arg;
1107## END|
1108##
1109## delimiter ;|
1110##
1111## CALL p1('c');
1112##
1113## CALL p2('a');
1114##
1115## SELECT f1('a');
1116
1117#
1118# Cleanup.
1119#
1120
1121## DROP PROCEDURE p1;
1122## DROP PROCEDURE p2;
1123## DROP FUNCTION f1;
1124
1125###########################################################################
1126#
1127# Test case for BUG#13909: Varchar Stored Procedure Parameter always BINARY
1128# string (ignores CHARACTER SET).
1129#
1130###########################################################################
1131
1132--echo
1133--echo ---------------------------------------------------------------
1134--echo BUG#13909
1135--echo ---------------------------------------------------------------
1136--echo
1137
1138#
1139# Prepare.
1140#
1141
1142--disable_warnings
1143DROP PROCEDURE IF EXISTS p1;
1144DROP PROCEDURE IF EXISTS p2;
1145--enable_warnings
1146
1147#
1148# Test case.
1149#
1150
1151delimiter |;
1152
1153CREATE PROCEDURE p1(arg VARCHAR(255))
1154BEGIN
1155SELECT CHARSET(arg);
1156END|
1157
1158CREATE PROCEDURE p2(arg VARCHAR(255) CHARACTER SET UTF8)
1159BEGIN
1160SELECT CHARSET(arg);
1161END|
1162
1163delimiter ;|
1164
1165CALL p1('t');
1166CALL p1(_UTF8 't');
1167
1168
1169CALL p2('t');
1170## CALL p2(_LATIN1 't');
1171
1172#
1173# Cleanup.
1174#
1175
1176DROP PROCEDURE p1;
1177DROP PROCEDURE p2;
1178
1179###########################################################################
1180#
1181# Test case for BUG#14188: BINARY variables have no 0x00 padding.
1182#
1183###########################################################################
1184
1185--echo
1186--echo ---------------------------------------------------------------
1187--echo BUG#14188
1188--echo ---------------------------------------------------------------
1189--echo
1190
1191#
1192# Prepare.
1193#
1194
1195--disable_warnings
1196DROP PROCEDURE IF EXISTS p1;
1197--enable_warnings
1198
1199#
1200# Test case.
1201#
1202
1203delimiter |;
1204CREATE PROCEDURE p1(arg1 BINARY(2), arg2 VARBINARY(2))
1205BEGIN
1206DECLARE var1 BINARY(2) DEFAULT 0x41;
1207DECLARE var2 VARBINARY(2) DEFAULT 0x42;
1208
1209SELECT HEX(arg1), HEX(arg2);
1210SELECT HEX(var1), HEX(var2);
1211END|
1212delimiter ;|
1213
1214CALL p1(0x41, 0x42);
1215
1216#
1217# Cleanup.
1218#
1219
1220DROP PROCEDURE p1;
1221
1222###########################################################################
1223#
1224# Test case for BUG#15148: Stored procedure variables accept non-scalar values.
1225#
1226###########################################################################
1227
1228--echo
1229--echo ---------------------------------------------------------------
1230--echo BUG#15148
1231--echo ---------------------------------------------------------------
1232--echo
1233
1234#
1235# Prepare.
1236#
1237
1238--disable_warnings
1239DROP PROCEDURE IF EXISTS p1;
1240DROP TABLE IF EXISTS t1;
1241--enable_warnings
1242
1243#
1244# Test case.
1245#
1246
1247CREATE TABLE t1(col1 TINYINT, col2 TINYINT);
1248
1249INSERT INTO t1 VALUES(1, 2), (11, 12);
1250
1251delimiter |;
1252CREATE PROCEDURE p1(arg TINYINT)
1253BEGIN
1254SELECT arg;
1255END|
1256delimiter ;|
1257
1258--error ER_OPERAND_COLUMNS
1259CALL p1((1, 2));
1260
1261## --error ER_OPERAND_COLUMNS
1262## oceanbase not support yet
1263## CALL p1((SELECT * FROM t1 LIMIT 1));
1264
1265## --error ER_OPERAND_COLUMNS
1266## oceanbase not support yet
1267## CALL p1((SELECT col1, col2 FROM t1 LIMIT 1));
1268
1269#
1270# Cleanup.
1271#
1272
1273DROP PROCEDURE p1;
1274DROP TABLE t1;
1275
1276###########################################################################
1277#
1278# Test case for BUG#13613: substring function in stored procedure.
1279#
1280###########################################################################
1281
1282--echo
1283--echo ---------------------------------------------------------------
1284--echo BUG#13613
1285--echo ---------------------------------------------------------------
1286--echo
1287
1288#
1289# Prepare.
1290#
1291
1292--disable_warnings
1293DROP PROCEDURE IF EXISTS p1;
1294DROP FUNCTION IF EXISTS f1;
1295--enable_warnings
1296
1297#
1298# Test case.
1299#
1300
1301delimiter |;
1302
1303CREATE PROCEDURE p1(x VARCHAR(50))
1304BEGIN
1305SET x = SUBSTRING(x, 1, 3);
1306SELECT x;
1307END|
1308
1309CREATE FUNCTION f1(x VARCHAR(50)) RETURNS VARCHAR(50)
1310BEGIN
1311RETURN SUBSTRING(x, 1, 3);
1312END|
1313
1314delimiter ;|
1315
1316CALL p1('abcdef');
1317
1318SELECT f1('ABCDEF');
1319
1320#
1321# Cleanup.
1322#
1323
1324DROP PROCEDURE p1;
1325DROP FUNCTION f1;
1326
1327###########################################################################
1328#
1329# Test case for BUG#13665: concat with '' produce incorrect results in SP.
1330#
1331###########################################################################
1332
1333--echo
1334--echo ---------------------------------------------------------------
1335--echo BUG#13665
1336--echo ---------------------------------------------------------------
1337--echo
1338
1339#
1340# Prepare.
1341#
1342
1343--disable_warnings
1344DROP FUNCTION IF EXISTS f1;
1345--enable_warnings
1346
1347#
1348# Test case.
1349#
1350
1351delimiter |;
1352CREATE FUNCTION f1() RETURNS VARCHAR(20000)
1353BEGIN
1354DECLARE var VARCHAR(2000);
1355
1356SET var = '';
1357SET var = CONCAT(var, 'abc');
1358SET var = CONCAT(var, '');
1359
1360RETURN var;
1361END|
1362delimiter ;|
1363
1364SELECT f1();
1365
1366#
1367# Cleanup.
1368#
1369
1370DROP FUNCTION f1;
1371
1372
1373#
1374# Bug#17226: Variable set in cursor on first iteration is assigned
1375# second iterations value
1376#
1377# The problem was in incorrect handling of local variables of type
1378# TEXT (BLOB).
1379#
1380--disable_warnings
1381DROP PROCEDURE IF EXISTS p1;
1382--enable_warnings
1383
1384delimiter |;
1385CREATE PROCEDURE p1()
1386BEGIN
1387DECLARE v_char VARCHAR(255);
1388DECLARE v_text VARCHAR(255) DEFAULT '';
1389
1390SET v_char = 'abc';
1391
1392SET v_text = v_char;
1393
1394SET v_char = 'def';
1395
1396SET v_text = concat(v_text, '|', v_char);
1397
1398SELECT v_text;
1399END|
1400delimiter ;|
1401
1402CALL p1();
1403
1404DROP PROCEDURE p1;
1405
1406#
1407# Bug #27415 Text Variables in stored procedures
1408# If the SP varible was also referenced on the right side
1409# the result was corrupted.
1410#
1411DELIMITER |;
1412
1413--disable_warnings
1414DROP PROCEDURE IF EXISTS bug27415_text_test|
1415DROP PROCEDURE IF EXISTS bug27415_text_test2|
1416--enable_warnings
1417
1418CREATE PROCEDURE bug27415_text_test(entity_id_str_in VARCHAR(255))
1419BEGIN
1420DECLARE str_remainder VARCHAR(255);
1421
1422SET str_remainder = entity_id_str_in;
1423
1424select 'before substr', str_remainder;
1425SET str_remainder = SUBSTRING(str_remainder, 3);
1426select 'after substr', str_remainder;
1427END|
1428
1429CREATE PROCEDURE bug27415_text_test2(entity_id_str_in VARCHAR(255))
1430BEGIN
1431DECLARE str_remainder VARCHAR(255);
1432DECLARE str_remainder2 VARCHAR(255);
1433
1434SET str_remainder2 = entity_id_str_in;
1435select 'before substr', str_remainder2;
1436SET str_remainder = SUBSTRING(str_remainder2, 3);
1437select 'after substr', str_remainder;
1438END|
1439
1440CALL bug27415_text_test('a,b,c')|
1441CALL bug27415_text_test('a,b,c')|
1442CALL bug27415_text_test2('a,b,c')|
1443CALL bug27415_text_test('a,b,c')|
1444
1445DROP PROCEDURE bug27415_text_test|
1446DROP PROCEDURE bug27415_text_test2|
1447
1448DELIMITER ;|
1449
1450# End of 5.0 tests.
1451
1452#
1453# Bug #26277 User variable returns one type in SELECT @v and other for CREATE as SELECT @v
1454#
1455--disable_warnings
1456drop function if exists f1;
1457drop table if exists t1;
1458--enable_warnings
1459
1460delimiter |;
1461create function f1() returns int
1462begin
1463if @a=1 then set @b='abc';
1464else set @b=1;
1465end if;
1466set @a=1;
1467return 0;
1468end|
1469
1470create table t1 (a int)|
1471insert into t1 (a) values (1), (2)|
1472
1473set @b:='test'|
1474set @a=0|
1475select f1(), @b from t1|
1476
1477set @b=1|
1478set @a=0|
1479select f1(), @b from t1|
1480
1481delimiter ;|
1482
1483drop function f1;
1484drop table t1;
1485# End of 5.1 tests.
1486
1487
1488###########################################################################
1489#
1490# Test case for BUG#28299: To-number conversion warnings work
1491# differenly with CHAR and VARCHAR sp variables
1492#
1493###########################################################################
1494
1495--echo
1496--echo ---------------------------------------------------------------
1497--echo BUG#28299
1498--echo ---------------------------------------------------------------
1499--echo
1500
1501DELIMITER |;
1502CREATE PROCEDURE ctest()
1503BEGIN
1504DECLARE i CHAR(16);
1505DECLARE j INT;
1506SET i= 'string';
1507SET j= 1 + i;
1508END|
1509DELIMITER ;|
1510
1511CALL ctest();
1512DROP PROCEDURE ctest;
1513
1514DELIMITER |;
1515CREATE PROCEDURE vctest()
1516BEGIN
1517DECLARE i VARCHAR(16);
1518DECLARE j INT;
1519SET i= 'string';
1520SET j= 1 + i;
1521END|
1522DELIMITER ;|
1523
1524CALL vctest();
1525DROP PROCEDURE vctest;
1526