1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Merge branch '10.4' into 10.5

This commit is contained in:
Oleksandr Byelkin
2023-11-08 12:59:00 +01:00
396 changed files with 10324 additions and 5797 deletions

View File

@ -1357,6 +1357,333 @@ drop function f1;
# End of 10.3 tests
#
#
# Start of 10.4 tests
#
#
# MDEV-32275 getting error 'Illegal parameter data types row and bigint for operation '+' ' when using ITERATE in a FOR..DO
#
#
# Unlabeled FOR/cursor with a nested labeled LOOP inside
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
FOR _row IN (SELECT '' AS a) DO
SELECT 'start of outerLoop';
innerLoop: LOOP
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _row.a = 'v1'
THEN
SELECT 'start of THEN block';
ITERATE innerLoop;
END IF;
SELECT 'end of innerLoop';
END LOOP;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 cpush [implicit_cursor]@0
2 cursor_copy_struct [implicit_cursor] _row@1
3 copen [implicit_cursor]@0
4 cfetch [implicit_cursor]@0 _row@1
5 jump_if_not 19(19) `[implicit_cursor]`%FOUND
6 stmt 0 "SELECT 'start of outerLoop'"
7 stmt 0 "SELECT 'start of innerLoop'"
8 jump_if_not 10(10) loopDone@0
9 jump 16
10 set loopDone@0 1
11 jump_if_not 14(14) _row.a@1["a"] = 'v1'
12 stmt 0 "SELECT 'start of THEN block'"
13 jump 7
14 stmt 0 "SELECT 'end of innerLoop'"
15 jump 7
16 stmt 0 "SELECT 'end of outerLoop'"
17 cfetch [implicit_cursor]@0 _row@1
18 jump 5
19 cpop 1
DROP PROCEDURE p1;
#
# Labeled FOR/cursor with a nested labeled LOOP
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
outerLoop:
FOR _row IN (SELECT '' AS a) DO
SELECT 'start of outerLoop';
innerLoop: LOOP
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _row.a = 'v1'
THEN
SELECT 'start of IF/v1/THEN block';
ITERATE innerLoop;
END IF;
IF _row.a = 'v2'
THEN
SELECT 'start of IF/v2/THEN block';
ITERATE outerLoop;
END IF;
SELECT 'end of innerLoop';
END LOOP;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 cpush [implicit_cursor]@0
2 cursor_copy_struct [implicit_cursor] _row@1
3 copen [implicit_cursor]@0
4 cfetch [implicit_cursor]@0 _row@1
5 jump_if_not 23(23) `[implicit_cursor]`%FOUND
6 stmt 0 "SELECT 'start of outerLoop'"
7 stmt 0 "SELECT 'start of innerLoop'"
8 jump_if_not 10(10) loopDone@0
9 jump 20
10 set loopDone@0 1
11 jump_if_not 14(14) _row.a@1["a"] = 'v1'
12 stmt 0 "SELECT 'start of IF/v1/THEN block'"
13 jump 7
14 jump_if_not 18(18) _row.a@1["a"] = 'v2'
15 stmt 0 "SELECT 'start of IF/v2/THEN block'"
16 cfetch [implicit_cursor]@0 _row@1
17 jump 5
18 stmt 0 "SELECT 'end of innerLoop'"
19 jump 7
20 stmt 0 "SELECT 'end of outerLoop'"
21 cfetch [implicit_cursor]@0 _row@1
22 jump 5
23 cpop 1
DROP PROCEDURE p1;
#
# Unlabeled FOR/integer with a labeled LOOP inside
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
FOR _index IN 1..10 DO
SELECT 'start of outerLoop';
innerLoop: LOOP
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _index = 1
THEN
SELECT 'start of THEN block';
ITERATE innerLoop;
END IF;
SELECT 'end of innerLoop';
END LOOP;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 set _index@1 1
2 set [target_bound]@2 10
3 jump_if_not 19(19) _index@1 <= [target_bound]@2
4 stmt 0 "SELECT 'start of outerLoop'"
5 stmt 0 "SELECT 'start of innerLoop'"
6 jump_if_not 8(8) loopDone@0
7 jump 14
8 set loopDone@0 1
9 jump_if_not 12(12) _index@1 = 1
10 stmt 0 "SELECT 'start of THEN block'"
11 jump 5
12 stmt 0 "SELECT 'end of innerLoop'"
13 jump 5
14 stmt 0 "SELECT 'end of outerLoop'"
15 set _index@1 _index@1 + 1
16 jump 3
DROP PROCEDURE p1;
#
# Labeled FOR/integer with a labeled LOOP inside
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
outerLoop:
FOR _index IN 1..10 DO
SELECT 'start of outerLoop';
innerLoop: LOOP
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _index = 1
THEN
SELECT 'start of IF/1/THEN block';
ITERATE innerLoop;
END IF;
IF _index = 2
THEN
SELECT 'start of IF/2/THEN block';
ITERATE outerLoop;
END IF;
SELECT 'end of innerLoop';
END LOOP;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 set _index@1 1
2 set [target_bound]@2 10
3 jump_if_not 24(24) _index@1 <= [target_bound]@2
4 stmt 0 "SELECT 'start of outerLoop'"
5 stmt 0 "SELECT 'start of innerLoop'"
6 jump_if_not 8(8) loopDone@0
7 jump 18
8 set loopDone@0 1
9 jump_if_not 12(12) _index@1 = 1
10 stmt 0 "SELECT 'start of IF/1/THEN block'"
11 jump 5
12 jump_if_not 16(16) _index@1 = 2
13 stmt 0 "SELECT 'start of IF/2/THEN block'"
14 set _index@1 _index@1 + 1
15 jump 3
16 stmt 0 "SELECT 'end of innerLoop'"
17 jump 5
18 stmt 0 "SELECT 'end of outerLoop'"
19 set _index@1 _index@1 + 1
20 jump 3
DROP PROCEDURE p1;
#
# Unlabeled FOR/integer with a labeled FOR inside
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
FOR _index_outer IN 1..10 DO
SELECT 'start of outerLoop';
innerLoop:
FOR _index_inner IN 1..10 DO
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _index_inner = 1
THEN
SELECT 'start of IF/1/THEN block';
ITERATE innerLoop;
END IF;
SELECT 'end of innerLoop';
END FOR;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 set _index_outer@1 1
2 set [target_bound]@2 10
3 jump_if_not 24(24) _index_outer@1 <= [target_bound]@2
4 stmt 0 "SELECT 'start of outerLoop'"
5 set _index_inner@3 1
6 set [target_bound]@4 10
7 jump_if_not 19(19) _index_inner@3 <= [target_bound]@4
8 stmt 0 "SELECT 'start of innerLoop'"
9 jump_if_not 11(11) loopDone@0
10 jump 19
11 set loopDone@0 1
12 jump_if_not 16(16) _index_inner@3 = 1
13 stmt 0 "SELECT 'start of IF/1/THEN block'"
14 set _index_inner@3 _index_inner@3 + 1
15 jump 7
16 stmt 0 "SELECT 'end of innerLoop'"
17 set _index_inner@3 _index_inner@3 + 1
18 jump 7
19 stmt 0 "SELECT 'end of outerLoop'"
20 set _index_outer@1 _index_outer@1 + 1
21 jump 3
DROP PROCEDURE p1;
#
# Labeled FOR/integer with a labeled FOR inside
#
CREATE OR REPLACE PROCEDURE p1()
BEGIN
DECLARE loopDone TINYINT DEFAULT FALSE;
outerLoop:
FOR _index_outer IN 1..10 DO
SELECT 'start of outerLoop';
innerLoop:
FOR _index_inner IN 1..10 DO
SELECT 'start of innerLoop';
IF loopDone THEN
LEAVE innerLoop;
END IF;
SET loopDone = TRUE;
IF _index_inner = 1
THEN
SELECT 'start of IF/1/THEN block';
ITERATE innerLoop;
END IF;
IF _index_inner = 2
THEN
SELECT 'start of IF/2/THEN block';
ITERATE outerLoop;
END IF;
SELECT 'end of innerLoop';
END FOR;
SELECT 'end of outerLoop';
END FOR;
END
$$
SHOW PROCEDURE CODE p1;
Pos Instruction
0 set loopDone@0 0
1 set _index_outer@1 1
2 set [target_bound]@2 10
3 jump_if_not 29(29) _index_outer@1 <= [target_bound]@2
4 stmt 0 "SELECT 'start of outerLoop'"
5 set _index_inner@3 1
6 set [target_bound]@4 10
7 jump_if_not 23(23) _index_inner@3 <= [target_bound]@4
8 stmt 0 "SELECT 'start of innerLoop'"
9 jump_if_not 11(11) loopDone@0
10 jump 23
11 set loopDone@0 1
12 jump_if_not 16(16) _index_inner@3 = 1
13 stmt 0 "SELECT 'start of IF/1/THEN block'"
14 set _index_inner@3 _index_inner@3 + 1
15 jump 7
16 jump_if_not 20(20) _index_inner@3 = 2
17 stmt 0 "SELECT 'start of IF/2/THEN block'"
18 set _index_outer@1 _index_outer@1 + 1
19 jump 3
20 stmt 0 "SELECT 'end of innerLoop'"
21 set _index_inner@3 _index_inner@3 + 1
22 jump 7
23 stmt 0 "SELECT 'end of outerLoop'"
24 set _index_outer@1 _index_outer@1 + 1
25 jump 3
DROP PROCEDURE p1;
#
# End of 10.4 tests
#
#
# MDEV-19640 Wrong SHOW PROCEDURE output for SET GLOBAL sysvar1=expr, sysvar2=expr
#
CREATE OR REPLACE PROCEDURE p1()