1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
|
--echo # Start of 11.8 tests
--echo #
--echo # MDEV-10862 Stored procedures: default values for parameters (optional parameters)
--echo #
SET sql_mode=oracle;
--echo #
--echo # Basic default parameter test for procedures
--echo #
DELIMITER $$;
CREATE OR REPLACE PROCEDURE p1(par1 IN INT, par2 IN INT DEFAULT 1)
AS
BEGIN
SELECT par1, par2 FROM DUAL;
END;
$$
DELIMITER ;$$
CALL p1(2,3);
CALL p1(2);
--error ER_SP_WRONG_NO_OF_ARGS
CALL p1(2,3,4);
--error ER_SP_WRONG_NO_OF_ARGS
CALL p1();
DROP PROCEDURE p1;
--echo #
--echo # Basic default parameter test for functions
--echo #
DELIMITER $$;
CREATE OR REPLACE FUNCTION f1(par1 INT, par2 INT DEFAULT 1) RETURN INT
AS
BEGIN
RETURN par1 + par2;
END;
$$
DELIMITER ;$$
SELECT f1(2,3) FROM DUAL;
SELECT f1(2) FROM DUAL;
--error ER_SP_WRONG_NO_OF_ARGS
SELECT f1(2,3,4) FROM DUAL;
--error ER_SP_WRONG_NO_OF_ARGS
SELECT f1() FROM DUAL;
DROP FUNCTION f1;
--echo #
--echo # OUT parameters cannot have default values
--echo #
DELIMITER $$;
--error ER_INVALID_DEFAULT_PARAM
CREATE OR REPLACE PROCEDURE p1(par1 IN INT DEFAULT 1, par2 OUT INT DEFAULT 2)
AS
BEGIN
SELECT par1 FROM DUAL;
END;
$$
DELIMITER ;$$
--echo #
--echo # INOUT parameters cannot have default values
--echo #
DELIMITER $$;
--error ER_INVALID_DEFAULT_PARAM
CREATE OR REPLACE PROCEDURE p1(par1 INOUT INT DEFAULT 1, par2 OUT INT DEFAULT 2)
AS
BEGIN
SELECT par1 FROM DUAL;
END;
$$
DELIMITER ;$$
--echo #
--echo # Test various data types
--echo #
CREATE TABLE t1 (a INT, b VARCHAR(10));
CREATE DATABASE d1;
USE d1;
CREATE TABLE t1 (a INT, b VARCHAR(10));
USE test;
DELIMITER $$;
CREATE OR REPLACE PROCEDURE p1(
par1 IN INT DEFAULT 1,
par2 IN VARCHAR(10) DEFAULT 'abc',
par3 IN DATETIME DEFAULT '2010-01-01 12:34:56',
par4 IN DECIMAL(10,2) DEFAULT 123.45,
par5 IN FLOAT DEFAULT 123.45,
par6 IN DOUBLE DEFAULT 123.45,
par7 IN CHAR DEFAULT 'a',
par8 IN BOOLEAN DEFAULT TRUE,
par9 IN ROW(a INT, b VARCHAR(10)) DEFAULT ROW(1, 'abc'),
par10 IN t1.a%TYPE DEFAULT 10,
par11 IN d1.t1.a%TYPE DEFAULT 10,
par12 IN t1%ROWTYPE DEFAULT (1, 'cde'),
par13 IN d1.t1%ROWTYPE DEFAULT (1, 'cde')
)
AS
BEGIN
SELECT par1, par2, par3, par4, par5, par6, par7, par8, par9.b, par10, par11, par12.b, par13.b FROM DUAL;
END;
$$
DELIMITER ;$$
CALL p1();
DROP PROCEDURE p1;
DROP TABLE t1;
DROP DATABASE d1;
--echo #
--echo # Expression as default value is not evaluated if value is provided
--echo #
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY);
DELIMITER $$;
CREATE FUNCTION f1() RETURN INT
AS
BEGIN
INSERT INTO t1 VALUES (NULL);
RETURN LAST_INSERT_ID();
END;
$$
CREATE PROCEDURE p1(par1 IN INT DEFAULT f1())
AS
BEGIN
SELECT par1 FROM DUAL;
END;
$$
DELIMITER ;$$
--disable_ps_protocol
CALL p1();
CALL p1(10);
CALL p1();
--enable_ps_protocol
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo #
--echo # Subquery as default value
--echo # NOTE: Oracle does not allow this
--echo #
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1);
DELIMITER $$;
CREATE PROCEDURE p1(par1 IN INT DEFAULT (SELECT a FROM t1))
AS
BEGIN
SELECT par1 FROM DUAL;
END;
$$
DELIMITER ;$$
CALL p1();
CALL p1(10);
DROP PROCEDURE p1;
DROP TABLE t1;
--echo #
--echo # Default value from another parameter
--echo # NOTE: Oracle does not allow this
--echo #
DELIMITER $$;
CREATE PROCEDURE p1(par1 IN INT, par2 IN INT DEFAULT par1)
AS
BEGIN
SELECT par1, par2 FROM DUAL;
END;
$$
DELIMITER ;$$
CALL p1(10);
CALL p1(10,20);
DROP PROCEDURE p1;
--echo #
--echo # Default value referencing self
--echo # NOTE: Oracle does not allow this
--echo #
DELIMITER $$;
--error ER_SP_UNDECLARED_VAR
CREATE PROCEDURE p1(par1 IN INT DEFAULT par1)
AS
BEGIN
NULL;
END;
$$
DELIMITER ;$$
--echo #
--echo # Default parameters in package's routines
--echo #
DELIMITER $$;
CREATE PACKAGE p1 AS
PROCEDURE p1(par1 IN INT, par2 IN INT DEFAULT 1);
FUNCTION f1(par1 IN INT, par2 IN INT DEFAULT 1) RETURN INT;
END p1;
$$
CREATE PACKAGE BODY p1 AS
PROCEDURE p1(par1 IN INT, par2 IN INT DEFAULT 1)
AS
BEGIN
SELECT par1, par2 FROM DUAL;
END;
FUNCTION f1(par1 IN INT, par2 IN INT DEFAULT 1) RETURN INT
AS
BEGIN
RETURN par1 + par2;
END;
END p1;
$$
DELIMITER ;$$
CALL p1.p1(5);
CALL p1.p1(5, 10);
SELECT p1.f1(5) FROM DUAL;
SELECT p1.f1(5, 10) FROM DUAL;
DROP PACKAGE p1;
--echo #
--echo # MDEV-35925 OUT and INOUT parameters shouldn't expect a default value
--echo #
# An IN param with default followed by an OUT param
DELIMITER $$;
--error ER_NOT_SUPPORTED_YET
CREATE PROCEDURE sp1(p1 IN INT DEFAULT 0, p2 OUT INT)
BEGIN
SET p2 = p2 + 1;
END;
--error ER_NOT_SUPPORTED_YET
CREATE PROCEDURE sp1(p1 IN INT DEFAULT 0, p2 INOUT INT)
BEGIN
SET p2 = p2 + 1;
END;
DELIMITER ;$$
--echo # End of 11.8 tests
|