mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-10914 ROW data type for stored routine variables
This commit is contained in:
179
mysql-test/suite/compat/oracle/r/binlog_stm_sp.result
Normal file
179
mysql-test/suite/compat/oracle/r/binlog_stm_sp.result
Normal file
@ -0,0 +1,179 @@
|
||||
SET sql_mode=ORACLE;
|
||||
#
|
||||
# MDEV-10914 ROW data type for stored routine variables
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
CREATE PROCEDURE p1
|
||||
AS
|
||||
rec ROW(a INT,b INT);
|
||||
BEGIN
|
||||
rec.a:=100;
|
||||
rec.b:=200;
|
||||
INSERT INTO t1 VALUES (rec.a,rec.b);
|
||||
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
||||
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
rec.a:=NULL;
|
||||
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
||||
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
||||
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
||||
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
rec.b:=NULL;
|
||||
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
||||
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
END;
|
||||
$$
|
||||
CALL p1();
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
100 200
|
||||
10 1
|
||||
10 1
|
||||
10 20
|
||||
10 21
|
||||
11 NULL
|
||||
11 0
|
||||
11 NULL
|
||||
11 0
|
||||
12 NULL
|
||||
12 NULL
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p1;
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT, b INT)
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
||||
AS
|
||||
rec ROW(a INT,b INT);
|
||||
BEGIN
|
||||
rec.a:=100;
|
||||
rec.b:=200;
|
||||
INSERT INTO t1 VALUES (rec.a,rec.b);
|
||||
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
||||
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
rec.a:=NULL;
|
||||
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
||||
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
||||
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
||||
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
rec.b:=NULL;
|
||||
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
||||
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
||||
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
||||
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
||||
END
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ( NAME_CONST('rec.a',100), NAME_CONST('rec.b',200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,201))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,200)=ROW(NULL,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,201)=ROW(NULL,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE ROW(NULL,200)=ROW(100,200)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,200)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(NULL,NULL)=ROW(100,200))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(100,200)=ROW(NULL,NULL))
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE ROW(NULL,NULL)=ROW(100,200)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,NULL)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; DROP PROCEDURE p1
|
||||
#
|
||||
# Testing ROW fields in LIMIT
|
||||
#
|
||||
FLUSH LOGS;
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (10),(10);
|
||||
CREATE TABLE t2 (a INT);
|
||||
CREATE PROCEDURE p1()
|
||||
AS
|
||||
a INT:= 1;
|
||||
rec ROW(a INT);
|
||||
BEGIN
|
||||
rec.a:= 1;
|
||||
INSERT INTO t2 SELECT 1 FROM t1 LIMIT a;
|
||||
INSERT INTO t2 SELECT 2 FROM t1 LIMIT rec.a;
|
||||
END;
|
||||
$$
|
||||
CALL p1();
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted
|
||||
DROP TABLE t1,t2;
|
||||
DROP PROCEDURE p1;
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000002 # Binlog_checkpoint # # master-bin.000002
|
||||
master-bin.000002 # Gtid # # GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; CREATE TABLE t1 (a INT)
|
||||
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10),(10)
|
||||
master-bin.000002 # Query # # COMMIT
|
||||
master-bin.000002 # Gtid # # GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; CREATE TABLE t2 (a INT)
|
||||
master-bin.000002 # Gtid # # GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
||||
AS
|
||||
a INT:= 1;
|
||||
rec ROW(a INT);
|
||||
BEGIN
|
||||
rec.a:= 1;
|
||||
INSERT INTO t2 SELECT 1 FROM t1 LIMIT a;
|
||||
INSERT INTO t2 SELECT 2 FROM t1 LIMIT rec.a;
|
||||
END
|
||||
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 1 FROM t1 LIMIT 1
|
||||
master-bin.000002 # Query # # COMMIT
|
||||
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 2 FROM t1 LIMIT 1
|
||||
master-bin.000002 # Query # # COMMIT
|
||||
master-bin.000002 # Gtid # # GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; DROP TABLE "t1","t2" /* generated by server */
|
||||
master-bin.000002 # Gtid # # GTID #-#-#
|
||||
master-bin.000002 # Query # # use `test`; DROP PROCEDURE p1
|
||||
#
|
||||
# End of MDEV-10914 ROW data type for stored routine variables
|
||||
#
|
@ -141,7 +141,7 @@ INSERT INTO t1 VALUES (NULL, NULL, '');
|
||||
INSERT INTO t1 VALUES (NULL, NULL, 'c');
|
||||
INSERT INTO t1 VALUES (NULL, NULL, NULL);
|
||||
SELECT LENGTH(a||b||c), a||b||c FROM t1 ORDER BY a,b,c;
|
||||
LENGTH(a||b||c) a||b||c
|
||||
LENGTH(a||b||c) a||b||c
|
||||
NULL NULL
|
||||
0
|
||||
1 c
|
||||
|
@ -887,3 +887,98 @@ DROP PROCEDURE p1;
|
||||
#
|
||||
# End of MDEV-10597 Cursors with parameters
|
||||
#
|
||||
#
|
||||
# MDEV-10914 ROW data type for stored routine variables
|
||||
#
|
||||
CREATE FUNCTION f1() RETURN INT
|
||||
AS
|
||||
a ROW(a INT, b INT);
|
||||
BEGIN
|
||||
a.b:= 200;
|
||||
RETURN a.b;
|
||||
END;
|
||||
$$
|
||||
SHOW FUNCTION CODE f1;
|
||||
Pos Instruction
|
||||
0 set a@0 NULL
|
||||
1 set a.b@0[1] 200
|
||||
2 freturn 3 a.b@0[1]
|
||||
SELECT f1();
|
||||
f1()
|
||||
200
|
||||
DROP FUNCTION f1;
|
||||
CREATE PROCEDURE p1
|
||||
AS
|
||||
rec ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
|
||||
BEGIN
|
||||
rec:= ROW(10,20.123456,30.123,'test');
|
||||
SELECT rec.a, rec.b, rec.c, rec.d;
|
||||
END;
|
||||
$$
|
||||
SHOW PROCEDURE CODE p1;
|
||||
Pos Instruction
|
||||
0 set rec@0 NULL
|
||||
1 set rec@0 (10,20.123456,30.123,'test')
|
||||
2 stmt 0 "SELECT rec.a, rec.b, rec.c, rec.d"
|
||||
CALL p1;
|
||||
rec.a rec.b rec.c rec.d
|
||||
10 20.123456 30.123 test
|
||||
DROP PROCEDURE p1;
|
||||
CREATE PROCEDURE p1
|
||||
AS
|
||||
rec ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) :=
|
||||
ROW(10,20.123456,30.123,'test');
|
||||
BEGIN
|
||||
SELECT rec.a, rec.b, rec.c, rec.d;
|
||||
END;
|
||||
$$
|
||||
SHOW PROCEDURE CODE p1;
|
||||
Pos Instruction
|
||||
0 set rec@0 (10,20.123456,30.123,'test')
|
||||
1 stmt 0 "SELECT rec.a, rec.b, rec.c, rec.d"
|
||||
CALL p1;
|
||||
rec.a rec.b rec.c rec.d
|
||||
10 20.123456 30.123 test
|
||||
DROP PROCEDURE p1;
|
||||
CREATE PROCEDURE p1
|
||||
AS
|
||||
rec1 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
|
||||
rec2 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10));
|
||||
BEGIN
|
||||
rec1:= ROW(10,20.123456,30.123,'test');
|
||||
rec2:= rec1;
|
||||
SELECT rec2.a, rec2.b, rec2.c, rec2.d;
|
||||
END;
|
||||
$$
|
||||
SHOW PROCEDURE CODE p1;
|
||||
Pos Instruction
|
||||
0 set rec1@0 NULL
|
||||
1 set rec2@1 NULL
|
||||
2 set rec1@0 (10,20.123456,30.123,'test')
|
||||
3 set rec2@1 rec1@0
|
||||
4 stmt 0 "SELECT rec2.a, rec2.b, rec2.c, rec2.d"
|
||||
CALL p1;
|
||||
rec2.a rec2.b rec2.c rec2.d
|
||||
10 20.123456 30.123 test
|
||||
DROP PROCEDURE p1;
|
||||
CREATE PROCEDURE p1
|
||||
AS
|
||||
rec1 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) :=
|
||||
ROW(10,20.123456,30.123,'test');
|
||||
rec2 ROW(a INT,b DOUBLE,c DECIMAL(10,3),d VARCHAR(10)) := rec1;
|
||||
BEGIN
|
||||
SELECT rec2.a, rec2.b, rec2.c, rec2.d;
|
||||
END;
|
||||
$$
|
||||
SHOW PROCEDURE CODE p1;
|
||||
Pos Instruction
|
||||
0 set rec1@0 (10,20.123456,30.123,'test')
|
||||
1 set rec2@1 rec1@0
|
||||
2 stmt 0 "SELECT rec2.a, rec2.b, rec2.c, rec2.d"
|
||||
CALL p1;
|
||||
rec2.a rec2.b rec2.c rec2.d
|
||||
10 20.123456 30.123 test
|
||||
DROP PROCEDURE p1;
|
||||
#
|
||||
# End of MDEV-10914 ROW data type for stored routine variables
|
||||
#
|
||||
|
2200
mysql-test/suite/compat/oracle/r/sp-row.result
Normal file
2200
mysql-test/suite/compat/oracle/r/sp-row.result
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user