mirror of
https://github.com/MariaDB/server.git
synced 2026-02-11 21:28:40 +01:00
Routine name resolution performed on a temporary memory root during execution. So on the second execution LEX::spname members pointed to a cleared memory. Fixing to peform the resolution to parse time, like the CALL statement does. During the execution time LEX::spname members now stay untouched.
275 lines
4.6 KiB
Text
275 lines
4.6 KiB
Text
SET sql_mode=ORACLE;
|
|
CREATE PACKAGE pkg1 AS
|
|
PROCEDURE p1;
|
|
FUNCTION f1 RETURN INT;
|
|
PROCEDURE p2show;
|
|
PROCEDURE p2public;
|
|
FUNCTION f2public RETURN TEXT;
|
|
END;
|
|
$$
|
|
CREATE PACKAGE BODY pkg1 AS
|
|
a INT:=10;
|
|
PROCEDURE p1 AS
|
|
b INT:=20;
|
|
BEGIN
|
|
b:=a;
|
|
b:=a+1;
|
|
a:=b;
|
|
a:=b+1;
|
|
a:=a+1;
|
|
SET @a:=@a+2;
|
|
SELECT f1() FROM DUAL;
|
|
END;
|
|
FUNCTION f1 RETURN INT AS
|
|
BEGIN
|
|
RETURN a;
|
|
END;
|
|
PROCEDURE p2private AS
|
|
BEGIN
|
|
SELECT 'This is p2private';
|
|
END;
|
|
PROCEDURE p2public AS
|
|
BEGIN
|
|
SELECT 'This is p2public';
|
|
END;
|
|
FUNCTION f2private RETURN TEXT AS
|
|
BEGIN
|
|
RETURN 'This is f2private';
|
|
END;
|
|
FUNCTION f2public RETURN TEXT AS
|
|
BEGIN
|
|
RETURN 'This is f2public';
|
|
END;
|
|
PROCEDURE p2show AS
|
|
BEGIN
|
|
SHOW FUNCTION CODE f2public;
|
|
SHOW FUNCTION CODE f2private;
|
|
SHOW PROCEDURE CODE p2public;
|
|
SHOW PROCEDURE CODE p2private;
|
|
SHOW PROCEDURE CODE p2show;
|
|
END;
|
|
BEGIN
|
|
a:=a+1;
|
|
DECLARE
|
|
b INT;
|
|
BEGIN
|
|
b:=a;
|
|
b:=a+1;
|
|
a:=b;
|
|
a:=b+1;
|
|
END;
|
|
END;
|
|
$$
|
|
SHOW PROCEDURE CODE pkg1.p1;
|
|
Pos Instruction
|
|
0 set b@0 20
|
|
1 set b@0 PACKAGE_BODY.a@0
|
|
2 set b@0 PACKAGE_BODY.a@0 + 1
|
|
3 set PACKAGE_BODY.a@0 b@0
|
|
4 set PACKAGE_BODY.a@0 b@0 + 1
|
|
5 set PACKAGE_BODY.a@0 PACKAGE_BODY.a@0 + 1
|
|
6 stmt 31 "SET @a:=@a+2"
|
|
7 stmt 0 "SELECT f1() FROM DUAL"
|
|
SHOW FUNCTION CODE pkg1.f1;
|
|
Pos Instruction
|
|
0 freturn int PACKAGE_BODY.a@0
|
|
SHOW PACKAGE BODY CODE pkg1;
|
|
Pos Instruction
|
|
0 set a@0 10
|
|
1 set a@0 a@0 + 1
|
|
2 set b@1 NULL
|
|
3 set b@1 a@0
|
|
4 set b@1 a@0 + 1
|
|
5 set a@0 b@1
|
|
6 set a@0 b@1 + 1
|
|
7 jump 11
|
|
CALL pkg1.p2show;
|
|
Pos Instruction
|
|
0 freturn blob 'This is f2public'
|
|
Pos Instruction
|
|
0 freturn blob 'This is f2private'
|
|
Pos Instruction
|
|
0 stmt 0 "SELECT 'This is p2public'"
|
|
Pos Instruction
|
|
0 stmt 0 "SELECT 'This is p2private'"
|
|
Pos Instruction
|
|
0 stmt 110 "SHOW FUNCTION CODE f2public"
|
|
1 stmt 110 "SHOW FUNCTION CODE f2private"
|
|
2 stmt 109 "SHOW PROCEDURE CODE p2public"
|
|
3 stmt 109 "SHOW PROCEDURE CODE p2private"
|
|
4 stmt 109 "SHOW PROCEDURE CODE p2show"
|
|
DROP PACKAGE pkg1;
|
|
CREATE TABLE t1 (a INT);
|
|
CREATE PACKAGE pkg1 AS
|
|
PROCEDURE p1;
|
|
END;
|
|
$$
|
|
CREATE PACKAGE BODY pkg1 AS
|
|
a t1.a%TYPE:=10;
|
|
PROCEDURE p1 AS
|
|
b t1.a%TYPE:=20;
|
|
BEGIN
|
|
b:=a;
|
|
b:=a+1;
|
|
b:=b+1;
|
|
a:=b;
|
|
a:=b+1;
|
|
a:=a+1;
|
|
END;
|
|
BEGIN
|
|
a:=a+1;
|
|
DECLARE
|
|
b t1.a%TYPE;
|
|
BEGIN
|
|
b:=a;
|
|
b:=a+1;
|
|
a:=b;
|
|
a:=b+1;
|
|
END;
|
|
END;
|
|
$$
|
|
SHOW PROCEDURE CODE pkg1.p1;
|
|
Pos Instruction
|
|
0 set b@0 20
|
|
1 set b@0 PACKAGE_BODY.a@0
|
|
2 set b@0 PACKAGE_BODY.a@0 + 1
|
|
3 set b@0 b@0 + 1
|
|
4 set PACKAGE_BODY.a@0 b@0
|
|
5 set PACKAGE_BODY.a@0 b@0 + 1
|
|
6 set PACKAGE_BODY.a@0 PACKAGE_BODY.a@0 + 1
|
|
SHOW PACKAGE BODY CODE pkg1;
|
|
Pos Instruction
|
|
0 set a@0 10
|
|
1 set a@0 a@0 + 1
|
|
2 set b@1 NULL
|
|
3 set b@1 a@0
|
|
4 set b@1 a@0 + 1
|
|
5 set a@0 b@1
|
|
6 set a@0 b@1 + 1
|
|
7 jump 11
|
|
DROP PACKAGE pkg1;
|
|
DROP TABLE t1;
|
|
CREATE PACKAGE pkg1 AS
|
|
PROCEDURE p1;
|
|
END;
|
|
$$
|
|
CREATE PACKAGE BODY pkg1 AS
|
|
a ROW(a INT,b TEXT):=ROW(10,'x10');
|
|
PROCEDURE p1 AS
|
|
b ROW(a INT,b TEXT):=ROW(20,'x20');
|
|
BEGIN
|
|
b:=a;
|
|
a:=b;
|
|
b.a:=a.a+1;
|
|
a.a:=b.a+1;
|
|
a.a:=a.a+1;
|
|
END;
|
|
BEGIN
|
|
a.a:=a.a+1;
|
|
DECLARE
|
|
b ROW(a INT,b TEXT):=ROW(30,'x30');
|
|
BEGIN
|
|
b:=a;
|
|
b.a:=a.a+1;
|
|
a:=b;
|
|
a.a:=b.a+1;
|
|
END;
|
|
END;
|
|
$$
|
|
SHOW PROCEDURE CODE pkg1.p1;
|
|
Pos Instruction
|
|
0 set b@0 (20,'x20')
|
|
1 set b@0 PACKAGE_BODY.a@0
|
|
2 set PACKAGE_BODY.a@0 b@0
|
|
3 set b.a@0[0] PACKAGE_BODY.a.a@0[0] + 1
|
|
4 set PACKAGE_BODY.a.a@0[0] b.a@0[0] + 1
|
|
5 set PACKAGE_BODY.a.a@0[0] PACKAGE_BODY.a.a@0[0] + 1
|
|
SHOW PACKAGE BODY CODE pkg1;
|
|
Pos Instruction
|
|
0 set a@0 (10,'x10')
|
|
1 set a.a@0[0] a.a@0[0] + 1
|
|
2 set b@1 (30,'x30')
|
|
3 set b@1 a@0
|
|
4 set b.a@1[0] a.a@0[0] + 1
|
|
5 set a@0 b@1
|
|
6 set a.a@0[0] b.a@1[0] + 1
|
|
7 jump 11
|
|
DROP PACKAGE pkg1;
|
|
CREATE TABLE t1 (a INT, b TEXT);
|
|
CREATE PACKAGE pkg1 AS
|
|
PROCEDURE p1;
|
|
END;
|
|
$$
|
|
CREATE PACKAGE BODY pkg1 AS
|
|
a t1%ROWTYPE:=ROW(10,'x10');
|
|
PROCEDURE p1 AS
|
|
b t1%ROWTYPE:=ROW(20,'x20');
|
|
BEGIN
|
|
b:=a;
|
|
a:=b;
|
|
b.a:=a.a+1;
|
|
a.a:=b.a+1;
|
|
a.a:=a.a+1;
|
|
END;
|
|
BEGIN
|
|
a.a:=a.a+1;
|
|
DECLARE
|
|
b t1%ROWTYPE:=ROW(30,'x30');
|
|
BEGIN
|
|
b:=a;
|
|
b.a:=a.a+1;
|
|
a:=b;
|
|
a.a:=b.a+1;
|
|
END;
|
|
END;
|
|
$$
|
|
SHOW PROCEDURE CODE pkg1.p1;
|
|
Pos Instruction
|
|
0 set b@0 (20,'x20')
|
|
1 set b@0 PACKAGE_BODY.a@0
|
|
2 set PACKAGE_BODY.a@0 b@0
|
|
3 set b.a@0["a"] PACKAGE_BODY.a.a@0["a"] + 1
|
|
4 set PACKAGE_BODY.a.a@0["a"] b.a@0["a"] + 1
|
|
5 set PACKAGE_BODY.a.a@0["a"] PACKAGE_BODY.a.a@0["a"] + 1
|
|
SHOW PACKAGE BODY CODE pkg1;
|
|
Pos Instruction
|
|
0 set a@0 (10,'x10')
|
|
1 set a.a@0["a"] a.a@0["a"] + 1
|
|
2 set b@1 (30,'x30')
|
|
3 set b@1 a@0
|
|
4 set b.a@1["a"] a.a@0["a"] + 1
|
|
5 set a@0 b@1
|
|
6 set a.a@0["a"] b.a@1["a"] + 1
|
|
7 jump 11
|
|
DROP PACKAGE pkg1;
|
|
DROP TABLE t1;
|
|
# Start of 10.11 tests
|
|
#
|
|
# MDEV-38451 `SHOW FUNCTION CODE package_func` crashes on the second execution
|
|
#
|
|
CREATE PACKAGE pkg1 AS
|
|
PROCEDURE p1();
|
|
END;
|
|
$$
|
|
CREATE PACKAGE BODY pkg1 AS
|
|
FUNCTION f1() RETURN INT AS
|
|
BEGIN
|
|
RETURN 10;
|
|
END;
|
|
PROCEDURE p1() AS
|
|
BEGIN
|
|
SHOW FUNCTION CODE f1;
|
|
END;
|
|
END;
|
|
$$
|
|
CALL pkg1.p1;
|
|
Pos Instruction
|
|
0 freturn int 10
|
|
CALL pkg1.p1;
|
|
Pos Instruction
|
|
0 freturn int 10
|
|
CALL pkg1.p1;
|
|
Pos Instruction
|
|
0 freturn int 10
|
|
DROP PACKAGE pkg1;
|
|
# End of 10.11 tests
|