--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 # --echo # MDEV-37489: SIGSEGV in get_param_default_value | store_schema_params --echo # --DELIMITER // CREATE OR REPLACE PROCEDURE p0 (x INT DEFAULT func()) AS BEGIN SELECT x; END; // --DELIMITER ; SET SESSION max_session_mem_used=8192; --ERROR ER_OPTION_PREVENTS_STATEMENT CALL p0(); SET @@max_session_mem_used=DEFAULT; --ERROR ER_SP_DOES_NOT_EXIST CALL p0(); SELECT * FROM information_schema.PARAMETERS where specific_name = 'p0'; --echo # with func() defined --DELIMITER // CREATE FUNCTION func(x INT DEFAULT 10) RETURN INT AS BEGIN RETURN x; END; // CREATE OR REPLACE PROCEDURE p0 (x INT DEFAULT func()) AS BEGIN SELECT x; END; // --DELIMITER ; SET SESSION max_session_mem_used=8192; --ERROR ER_OPTION_PREVENTS_STATEMENT CALL p0(); SET @@max_session_mem_used=DEFAULT; CALL p0(); SELECT * FROM information_schema.PARAMETERS where specific_name = 'p0'; --echo # with multiple functions --DELIMITER // CREATE FUNCTION func2(x INT DEFAULT 10) RETURN INT AS BEGIN RETURN x; END; // CREATE OR REPLACE PROCEDURE p0 (x INT DEFAULT func(), y INT DEFAULT func2()) AS BEGIN SELECT x, y; END; // --DELIMITER ; SET SESSION max_session_mem_used=8192; --ERROR ER_OPTION_PREVENTS_STATEMENT CALL p0(); SET @@max_session_mem_used=DEFAULT; CALL p0(); SELECT * FROM information_schema.PARAMETERS where specific_name = 'p0'; --echo # with function and constant default param --DELIMITER // CREATE OR REPLACE PROCEDURE p0 (x INT DEFAULT func(), y INT DEFAULT func2(), z INT DEFAULT 10) AS BEGIN SELECT x, y, z; END; // --DELIMITER ; SET SESSION max_session_mem_used=8192; --ERROR ER_OPTION_PREVENTS_STATEMENT CALL p0(); SET @@max_session_mem_used=DEFAULT; CALL p0(); SELECT * FROM information_schema.PARAMETERS where specific_name = 'p0'; DROP PROCEDURE p0; DROP FUNCTION func; DROP FUNCTION func2; --echo # End of 11.8 tests