Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions mysql-test/main/ps-local.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
SET NAMES utf8mb3;
SET sql_mode=ORACLE;
CREATE PROCEDURE p1 AS
TYPE rec0_t IS RECORD (a INT, b INT);
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
c0 cur0_t;
ps_name VARCHAR(32) DEFAULT 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT 1,2';
OPEN c0 FOR LOCAL ps_name;
END;
$$
ERROR HY000: Incorrect usage of c0 and OPEN..FOR LOCAL ps_name_variable
SET sql_mode=DEFAULT;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
CALL p1;
c0
1
DROP PROCEDURE p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE stmt FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
CALL p1;
c0
1
DROP PROCEDURE p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE stmt;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
CALL p1;
c0
1
DROP PROCEDURE p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE stmt;
END;
$$
CALL p1;
c0
1
DROP PROCEDURE p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) CHARACTER SET latin1 DEFAULT 'àçé';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
CALL p1;
c0
1
DROP PROCEDURE p1;
95 changes: 95 additions & 0 deletions mysql-test/main/ps-local.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
SET NAMES utf8mb3;

# OPEN strict_cursor_variable FROM LOCAL ps_name_variable -- not supported
SET sql_mode=ORACLE;
DELIMITER $$;
--error ER_WRONG_USAGE
CREATE PROCEDURE p1 AS
TYPE rec0_t IS RECORD (a INT, b INT);
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
c0 cur0_t;
ps_name VARCHAR(32) DEFAULT 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT 1,2';
OPEN c0 FOR LOCAL ps_name;
END;
$$
DELIMITER ;$$
SET sql_mode=DEFAULT;


# PREPARE extended; EXECUTE extended; DEALLOCATE extended;

DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;

# PREPARE simple; EXECUTE extended; DEALLOCATE extended;

DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE stmt FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;

# PREPARE extended; EXECUTE simple; DEALLOCATE extended;

DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE stmt;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;

# PREPARE extended; EXECUTE extended; DEALLOCATE simple;

DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) DEFAULT 'stmt';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE stmt;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;


# Extended name with non-ASCII characters

DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
DECLARE spvar VARCHAR(32) CHARACTER SET latin1 DEFAULT 'àçé';
PREPARE LOCAL spvar FROM 'SELECT 1 AS c0';
EXECUTE LOCAL spvar;
DEALLOCATE PREPARE LOCAL spvar;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;
88 changes: 88 additions & 0 deletions mysql-test/main/sp-cursor-for-ps.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
SET NAMES utf8mb3;
SET sql_mode=ORACLE;
CREATE PROCEDURE p1 AS
TYPE rec0_t IS RECORD (a INT, b INT);
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
c0 cur0_t;
BEGIN
PREPARE stmt FROM 'SELECT 1,2';
OPEN c0 FOR PREPARE stmt;
END;
$$
ERROR HY000: Incorrect usage of c0 and OPEN..FOR PREPARE ps_name
CREATE PROCEDURE p1 AS
v0 TEXT;
c0 SYS_REFCURSOR;
BEGIN
PREPARE stmt FROM 'SELECT 123';
OPEN c0 FOR PREPARE stmt;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
END;
$$
CALL p1;
v0
123
DROP PROCEDURE p1;
CREATE FUNCTION f1() RETURN INT AS
c0 SYS_REFCURSOR;
BEGIN
OPEN c0 FOR PREPARE stmt;
RETURN 0;
END;
$$
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
v0 TEXT;
ps_name VARCHAR(30) := 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT 10';
OPEN c0 FOR LOCAL ps_name;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
END;
$$
CALL p1;
v0
10
DROP PROCEDURE p1;
CREATE FUNCTION f1() RETURN INT AS
c0 SYS_REFCURSOR;
spvar VARCHAR(10) DEFAULT 'stmt0';
BEGIN
OPEN c0 FOR LOCAL spvar;
RETURN 0;
END;
$$
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
ps_name VARCHAR(10) := 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT :a';
OPEN c0 FOR LOCAL ps_name;
END;
$$
CALL p1;
ERROR HY000: Incorrect arguments to OPEN
DROP PROCEDURE p1;
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
v0 TEXT;
ps_name VARCHAR(30) := 'àçé';
BEGIN
PREPARE àçé FROM 'SELECT 10';
OPEN c0 FOR LOCAL ps_name;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
DEALLOCATE PREPARE àçé;
END;
$$
CALL p1;
v0
10
DROP PROCEDURE p1;
121 changes: 121 additions & 0 deletions mysql-test/main/sp-cursor-for-ps.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
SET NAMES utf8mb3;
SET sql_mode=ORACLE;

# OPEN strict_cursor_variable FOR PREPARE stmt - not supported

DELIMITER $$;
--error ER_WRONG_USAGE
CREATE PROCEDURE p1 AS
TYPE rec0_t IS RECORD (a INT, b INT);
TYPE cur0_t IS REF CURSOR RETURN rec0_t;
c0 cur0_t;
BEGIN
PREPARE stmt FROM 'SELECT 1,2';
OPEN c0 FOR PREPARE stmt;
END;
$$
DELIMITER ;$$


# OPEN c FOR PREPARE stmt - a working example

DELIMITER $$;
CREATE PROCEDURE p1 AS
v0 TEXT;
c0 SYS_REFCURSOR;
BEGIN
PREPARE stmt FROM 'SELECT 123';
OPEN c0 FOR PREPARE stmt;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;


# OPEN c FOR PREPARE stmt - not allowed in a stored function

DELIMITER $$;
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() RETURN INT AS
c0 SYS_REFCURSOR;
BEGIN
OPEN c0 FOR PREPARE stmt;
RETURN 0;
END;
$$
DELIMITER ;$$


# OPEN c FOR LOCAL var

DELIMITER $$;
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
v0 TEXT;
ps_name VARCHAR(30) := 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT 10';
OPEN c0 FOR LOCAL ps_name;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;


# OPEN c FOR LOCAL spvar - not allowed in a stored function
DELIMITER $$;
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() RETURN INT AS
c0 SYS_REFCURSOR;
spvar VARCHAR(10) DEFAULT 'stmt0';
BEGIN
OPEN c0 FOR LOCAL spvar;
RETURN 0;
END;
$$
DELIMITER ;$$


# OPEN c FOR LOCAL var - not all parameters bound
DELIMITER $$;
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
ps_name VARCHAR(10) := 'stmt';
BEGIN
PREPARE stmt FROM 'SELECT :a';
OPEN c0 FOR LOCAL ps_name;
END;
$$
DELIMITER ;$$
--error ER_WRONG_ARGUMENTS
CALL p1;
DROP PROCEDURE p1;


# OPEN c FOR LOCAL var - non-ascii characters in PS name

DELIMITER $$;
CREATE PROCEDURE p1 AS
c0 SYS_REFCURSOR;
v0 TEXT;
ps_name VARCHAR(30) := 'àçé';
BEGIN
PREPARE àçé FROM 'SELECT 10';
OPEN c0 FOR LOCAL ps_name;
FETCH c0 INTO v0;
CLOSE c0;
SELECT v0;
DEALLOCATE PREPARE àçé;
END;
$$
DELIMITER ;$$
CALL p1;
DROP PROCEDURE p1;
Loading
Loading