Skip to content

Commit 28f5322

Browse files
MDEV-37054: Implement INFORMATION_SCHEMA.PARAMETERS.PARAMETER_DEFAULT column
MariaDB 11.8 and above now supports `DEFAULT` values for parameters in stored procedures and functions. This commit introduces the `INFORMATION_SCHEMA.PARAMETERS.PARAMETER_DEFAULT` column to display the default value of parameters. The value is only shown if the current user or any of it's enabled roles is the owner of parameter's `SPECIFIC_SCHEMA`, otherwise `NULL`.
1 parent 9057f74 commit 28f5322

19 files changed

+1331
-41
lines changed

mysql-test/main/information_schema.result

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ information_schema EVENTS EVENT_DEFINITION
900900
information_schema OPTIMIZER_TRACE QUERY
901901
information_schema OPTIMIZER_TRACE TRACE
902902
information_schema PARAMETERS DTD_IDENTIFIER
903+
information_schema PARAMETERS PARAMETER_DEFAULT
903904
information_schema PARTITIONS PARTITION_EXPRESSION
904905
information_schema PARTITIONS SUBPARTITION_EXPRESSION
905906
information_schema PARTITIONS PARTITION_DESCRIPTION

mysql-test/main/information_schema_parameters.result

Lines changed: 72 additions & 34 deletions
Large diffs are not rendered by default.

mysql-test/main/information_schema_parameters.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
# NUMERIC_PRECISION same as for COLUMNS
2828
# NUMERIC_SCALE same as for COLUMNS
2929
# DTD_IDENTIFIER same as for PARAMETERS
30+
# PARAMETER_DEFAULT the parameter's default value
3031
###############################################################################
3132
-- echo # ========== parameters.1 ==========
3233
USE INFORMATION_SCHEMA;

mysql-test/main/sp-default-param.result

Lines changed: 411 additions & 1 deletion
Large diffs are not rendered by default.

mysql-test/main/sp-default-param.test

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ DELIMITER ;$$
8484

8585
CALL p1();
8686

87+
# PARAMETER_DEFAULT Column test for various data types
88+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p1';
89+
8790
DROP PROCEDURE p1;
8891
DROP TABLE t1;
8992
DROP DATABASE d1;
@@ -137,6 +140,252 @@ CREATE PROCEDURE sp1(IN p1 INT DEFAULT 0, IN OUT p2 INT)
137140
BEGIN
138141
SET p2 = p2 + 1;
139142
END;
143+
$$
140144
DELIMITER ;$$
141145

142146
--echo # End of 11.8 tests
147+
148+
--echo #
149+
--echo # MDEV-37054: Implement INFORMATION_SCHEMA.PARAMETERS.PARAMETER_DEFAULT column
150+
--echo #
151+
152+
CREATE TABLE t (a INT);
153+
INSERT INTO t values (1);
154+
155+
--echo # Procedure with default parameters
156+
157+
DELIMITER //;
158+
159+
# No parameter default & constant default parameters
160+
CREATE OR REPLACE PROCEDURE p1(a INT,
161+
b INTEGER DEFAULT 9999,
162+
c INT DEFAULT NULL) DETERMINISTIC
163+
BEGIN
164+
SELECT b;
165+
END;
166+
//
167+
168+
CREATE OR REPLACE PROCEDURE p2(a INT DEFAULT 99,
169+
b VARCHAR(5) DEFAULT 'maria',
170+
c VARCHAR(10) DEFAULT CONCAT(b, 'db'))
171+
BEGIN
172+
SELECT b;
173+
END;
174+
//
175+
176+
# Default parameter as an epxression and function
177+
CREATE OR REPLACE PROCEDURE p3(a INT DEFAULT 1,
178+
b INT DEFAULT (a+1),
179+
c INT DEFAULT POW(2,b),
180+
d INET6 DEFAULT INET6_NTOA(UNHEX('0A000101')))
181+
BEGIN
182+
SELECT a, b, c FROM DUAL;
183+
END;
184+
//
185+
186+
# Subquery as default value
187+
CREATE OR REPLACE PROCEDURE p4(x INT DEFAULT (SELECT a from t))
188+
BEGIN
189+
SELECT x FROM DUAL;
190+
END;
191+
//
192+
193+
# another stored function as a default parameter
194+
CREATE OR REPLACE FUNCTION func(a INT DEFAULT 123) RETURNS INT
195+
BEGIN
196+
RETURN a;
197+
END;
198+
//
199+
200+
CREATE OR REPLACE PROCEDURE p5(x INT DEFAULT func())
201+
BEGIN
202+
SELECT x FROM DUAL;
203+
END;
204+
//
205+
206+
# date-time functions as default params
207+
CREATE OR REPLACE PROCEDURE p6(a TIMESTAMP DEFAULT NOW(), b DATE DEFAULT CURDATE())
208+
BEGIN
209+
SELECT a, b;
210+
END;
211+
//
212+
213+
# sql_mode specific functions as default params
214+
CREATE OR REPLACE PROCEDURE p7(a VARCHAR(5) DEFAULT 'maria',
215+
b VARCHAR(10) DEFAULT CONCAT(a, NULL, 'db'))
216+
BEGIN
217+
SELECT b from dual;
218+
END;
219+
//
220+
221+
DELIMITER ;//
222+
223+
--echo # Constant default parameters
224+
query_vertical SHOW CREATE PROCEDURE p1;
225+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p1';
226+
227+
query_vertical SHOW CREATE PROCEDURE p2;
228+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p2';
229+
230+
--echo # Default parameter as an epxression and function
231+
CALL p3();
232+
query_vertical SHOW CREATE PROCEDURE p3;
233+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p3';
234+
235+
--echo # Subquery as default value
236+
query_vertical SHOW CREATE PROCEDURE p4;
237+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p4';
238+
239+
--echo # another stored function as a default parameter
240+
query_vertical SHOW CREATE PROCEDURE p5;
241+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p5';
242+
243+
--echo # date-time functions as default params
244+
query_vertical SHOW CREATE PROCEDURE p6;
245+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p6';
246+
247+
--echo # sql_mode specific functions as default params
248+
query_vertical SHOW CREATE PROCEDURE p7;
249+
250+
--echo # sql_mode=DEFAULT
251+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p7';
252+
253+
--echo # sql_mode=ORACLE
254+
SET sql_mode=ORACLE;
255+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'p7';
256+
SET sql_mode=DEFAULT;
257+
258+
DROP PROCEDURE p1;
259+
DROP PROCEDURE p2;
260+
DROP PROCEDURE p3;
261+
DROP PROCEDURE p4;
262+
DROP PROCEDURE p5;
263+
DROP PROCEDURE p6;
264+
DROP PROCEDURE p7;
265+
DROP FUNCTION func;
266+
267+
--echo # Functions with defualt parameters
268+
269+
DELIMITER //;
270+
271+
CREATE OR REPLACE FUNCTION f1(a INT, b INT DEFAULT 9999, c INT DEFAULT NULL) RETURNS INT
272+
BEGIN
273+
RETURN b;
274+
END;
275+
//
276+
277+
# Default parameter as an expression
278+
CREATE OR REPLACE FUNCTION f2(a INT DEFAULT 99, b INT DEFAULT (a+1)) RETURNS INT
279+
BEGIN
280+
RETURN b;
281+
END;
282+
//
283+
284+
# Default param as function
285+
CREATE OR REPLACE FUNCTION f3(a INT DEFAULT 8,
286+
b INT DEFAULT LOG2(a),
287+
c VARCHAR(5) DEFAULT (IF(LOG2(a)=3,'yes','no'))) RETURNS INT
288+
BEGIN
289+
RETURN b;
290+
END;
291+
//
292+
293+
# Subquery as function's default parameter
294+
CREATE OR REPLACE FUNCTION f4(x INT DEFAULT (SELECT a FROM t)) RETURNS INT
295+
BEGIN
296+
RETURN x;
297+
END;
298+
//
299+
300+
# date-time functions as default params
301+
CREATE OR REPLACE FUNCTION f5(a TIMESTAMP DEFAULT NOW(), b DATE DEFAULT CURDATE()) RETURNS DATE
302+
BEGIN
303+
RETURN b;
304+
END;
305+
//
306+
307+
# sql_mode specific functions as default params
308+
CREATE OR REPLACE FUNCTION f6(a VARCHAR(5) DEFAULT 'maria',
309+
b VARCHAR(10) DEFAULT CONCAT(a, NULL, 'db')) RETURNS VARCHAR(10)
310+
BEGIN
311+
RETURN b;
312+
END;
313+
//
314+
315+
DELIMITER ;//
316+
317+
--echo # Constant Default parameter
318+
query_vertical SHOW CREATE FUNCTION f1;
319+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f1';
320+
321+
--echo # Default parameter as an expression
322+
query_vertical SHOW CREATE FUNCTION f2;
323+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f2';
324+
325+
--echo # Default parameter as a function
326+
query_vertical SHOW CREATE FUNCTION f3;
327+
SELECT f3();
328+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f3';
329+
330+
--echo # Subquery as function's default parameter
331+
query_vertical SHOW CREATE FUNCTION f4;
332+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f4';
333+
334+
--echo # date-time functions as default params
335+
query_vertical SHOW CREATE FUNCTION f5;
336+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f5';
337+
338+
--echo # sql_mode specific functions as default params
339+
query_vertical SHOW CREATE FUNCTION f6;
340+
341+
--echo # sql_mode=DEFAULT
342+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f6';
343+
344+
--echo # sql_mode=ORACLE
345+
SET sql_mode=ORACLE;
346+
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'f6';
347+
SET sql_mode=DEFAULT;
348+
349+
DROP FUNCTION f1;
350+
DROP FUNCTION f2;
351+
DROP FUNCTION f3;
352+
DROP FUNCTION f4;
353+
DROP FUNCTION f5;
354+
DROP FUNCTION f6;
355+
DROP TABLE t;
356+
357+
--echo # Test to verify consistent printing of default values
358+
--echo # This test checks that a column's default value and a parameter's default
359+
--echo # value are printed in the same way.
360+
361+
CREATE TABLE t (a1 INT,
362+
a2 INT DEFAULT NULL,
363+
a3 INT NOT NULL,
364+
a4 VARCHAR(10) NOT NULL,
365+
b INT DEFAULT 1,
366+
c INT DEFAULT (b+1),
367+
d INT DEFAULT POW(2,b),
368+
e VARCHAR(10) DEFAULT 'maria',
369+
f VARCHAR(10) DEFAULT CONCAT(e,'db'));
370+
371+
DELIMITER //;
372+
CREATE PROCEDURE proc(a1 INT,
373+
a2 INT DEFAULT NULL,
374+
b INT DEFAULT 1,
375+
c INT DEFAULT (b+1),
376+
d INT DEFAULT POW(2,b),
377+
e VARCHAR(10) DEFAULT 'maria',
378+
f VARCHAR(10) DEFAULT CONCAT(e,'db'))
379+
BEGIN
380+
SELECT d FROM DUAL;
381+
END;
382+
//
383+
DELIMITER ;//
384+
385+
SELECT COLUMN_NAME, COLUMN_DEFAULT, (COLUMN_DEFAULT IS NULL) AS `IS_NULL` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't';
386+
SELECT PARAMETER_NAME, PARAMETER_DEFAULT, (PARAMETER_DEFAULT IS NULL) AS `IS_NULL` FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME = 'proc';
387+
388+
DROP TABLE t;
389+
DROP PROCEDURE proc;
390+
391+
--echo # End of 12.2 tests

mysql-test/main/sp-destruct.result

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ CHARACTER_SET_NAME NULL
242242
COLLATION_NAME NULL
243243
DTD_IDENTIFIER int(11)
244244
ROUTINE_TYPE FUNCTION
245+
PARAMETER_DEFAULT NULL
245246
SPECIFIC_CATALOG def
246247
SPECIFIC_SCHEMA test
247248
SPECIFIC_NAME f2
@@ -258,6 +259,7 @@ CHARACTER_SET_NAME NULL
258259
COLLATION_NAME NULL
259260
DTD_IDENTIFIER int(11)
260261
ROUTINE_TYPE FUNCTION
262+
PARAMETER_DEFAULT NULL
261263
UPDATE mysql.proc SET type='FUNCTION' WHERE name='f1' AND db='test';
262264
EXECUTE IMMEDIATE CONCAT('ALTER TABLE mysql.proc MODIFY type ', @type0);
263265
SHOW COLUMNS IN mysql.proc LIKE 'type';

mysql-test/main/sp-security.result

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,4 +1726,52 @@ disconnect conn1;
17261726
drop user user@localhost;
17271727
drop database test_db;
17281728
# End of 11.3 tests
1729+
#
1730+
# MDEV-37054: Implement INFORMATION_SCHEMA.PARAMETERS.PARAMETER_DEFAULT column
1731+
#
1732+
CREATE PROCEDURE proc(a INT DEFAULT 1, b INT DEFAULT (a+1), c INT DEFAULT POW(2,b)) AS
1733+
BEGIN
1734+
SELECT a, b, c FROM DUAL;
1735+
END;
1736+
//
1737+
CREATE FUNCTION func(a INT DEFAULT 8, b INT DEFAULT LOG2(a)) RETURN INT AS
1738+
BEGIN
1739+
RETURN b;
1740+
END;
1741+
//
1742+
CREATE USER user@localhost;
1743+
GRANT EXECUTE ON PROCEDURE test.proc TO user@localhost;
1744+
GRANT EXECUTE ON FUNCTION test.func TO user@localhost;
1745+
CONNECT conn1, localhost, user, , test;
1746+
SELECT specific_schema, specific_name, parameter_name, parameter_default FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'proc';
1747+
specific_schema specific_name parameter_name parameter_default
1748+
test proc a NULL
1749+
test proc b NULL
1750+
test proc c NULL
1751+
SELECT specific_schema, specific_name, parameter_name, parameter_default FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'func';
1752+
specific_schema specific_name parameter_name parameter_default
1753+
test func NULL NULL
1754+
test func a NULL
1755+
test func b NULL
1756+
connection default;
1757+
disconnect conn1;
1758+
GRANT SHOW CREATE ROUTINE ON PROCEDURE test.proc TO user@localhost;
1759+
GRANT SHOW CREATE ROUTINE ON FUNCTION test.func TO user@localhost;
1760+
CONNECT conn1, localhost, user, , test;
1761+
SELECT specific_schema, specific_name, parameter_name, parameter_default FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'proc';
1762+
specific_schema specific_name parameter_name parameter_default
1763+
test proc a 1
1764+
test proc b (`a` + 1)
1765+
test proc c pow(2,`b`)
1766+
SELECT specific_schema, specific_name, parameter_name, parameter_default FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'func';
1767+
specific_schema specific_name parameter_name parameter_default
1768+
test func NULL NULL
1769+
test func a 8
1770+
test func b log2(`a`)
1771+
connection default;
1772+
disconnect conn1;
1773+
DROP USER user@localhost;
1774+
DROP PROCEDURE proc;
1775+
DROP FUNCTION func;
1776+
# End of 12.2 tests
17291777
set @@global.collation_server=@save_collation_server;

0 commit comments

Comments
 (0)