WL#2822: INFORMATION_SCHEMA.ROUTINES: Add missing columns
Affects: Server-5.5
—
Status: Complete
MySQL will add columns to the INFORMATION_SCHEMA.ROUTINES table, to store and display important information about the RETURNS data type definition of a stored function. Rationale --------- This information is especially important to users that connect to MySQL via ODBC/JDBC. Compatibility ------------- These columns are required by standard SQL. Other DBMSs (e.g. SQL Server and DB2) also provide this information.
The INFORMATION_SCHEMA.ROUTINES table must be amended, to add columns
that store and display important missing information about the RETURNS
data type of a stored function.
The Task
--------
[Note added 2007-04-03]
Until now the description said:
"- Rename the current INFORMATION_SCHEMA.ROUTINES column called
DTD_IDENTIFIER to DATA_TYPE. (Or remove the DTD_IDENTIFIER column
and add a new column called DATA_TYPE.)"
But for compatibility, DTD_IDENTIFIER will not be removed.
The new DATA_TYPE column will be a separate column.
- Add 6 new columns to ROUTINES: CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH, CHARACTER_SET_NAME, COLLATION_NAME,
NUMERIC_PRECISION and NUMERIC_SCALE. The position of the new
columns must be between the existing ROUTINE_TYPE and
ROUTINE_BODY columns; that is, the new ROUTINES table will
look like this:
ROUTINES
Column Name Remarks
----------- -------
SPECIFIC_NAME name of stored routine
ROUTINE_CATALOG NULL
ROUTINE_SCHEMA routine's database
ROUTINE_NAME name of stored routine
ROUTINE_TYPE PROCEDURE or FUNCTION
DATA_TYPE same as for COLUMNS
CHARACTER_MAXIMUM_LENGTH same as for COLUMNS
CHARACTER_OCTET_LENGTH same as for COLUMNS
NUMERIC_PRECISION same as for COLUMNS
NUMERIC_SCALE same as for COLUMNS
CHARACTER_SET_NAME same as for COLUMNS
COLLATION_NAME same as for COLUMNS
DTD_IDENTIFIER e.g. "enum('a','b')"
ROUTINE_BODY SQL
ROUTINE_DEFINITION body of the routine
EXTERNAL_NAME NULL
EXTERNAL_LANGUAGE NULL
PARAMETER_STYLE SQL
IS_DETERMINISTIC YES or NO
SQL_DATA_ACCESS CONTAINS SQL, NO SQL, READS SQL DATA
or MODIFIES SQL DATA
SQL_PATH NULL
SECURITY_TYPE INVOKER or DEFINER
CREATED timestamp at CREATE time
LAST_ALTERED timestamp at last alteration (may be CREATE time)
SQL_MODE sql_mode (MySQL extension)
ROUTINE_COMMENT comment (MySQL extension)
DEFINER creator of routine (MySQL extension)
Rules
-----
- If a stored routine is a function, it must have a RETURNS clause
that defines the data type of the value that the function will
return. In that case, the new columns -- DATA_TYPE through NUMERIC_SCALE
inclusive -- will get the same information on that data type as is
shown in the INFORMATION_SCHEMA.COLUMNS table for a column's data type
definition.
- If a stored routine is a procedure, all of the new columns will be NULL.
- The information shown in the other columns of ROUTINES is not affected;
all columns will continue to show the same information as they currently do.
Examples
--------
For example, after:
CREATE FUNCTION db17.f (a INT) RETURNS CHAR(10) RETURN 'a'//
we have one row in ROUTINES:
ROUTINES
SPECIFIC_NAME f
ROUTINE_CATALOG NULL
ROUTINE_SCHEMA db17
ROUTINE_NAME f
ROUTINE_TYPE FUNCTION
DTD_IDENTIFIER char(10)
DATA_TYPE char
CHARACTER_MAXIMUM_LENGTH 10
CHARACTER_OCTET_LENGTH 10
CHARACTER_SET_NAME latin1 (for example)
COLLATION_NAME latin1_swedish_ci (for example)
NUMERIC_PRECISION NULL
NUMERIC_SCALE NULL
ROUTINE_BODY SQL
ROUTINE_DEFINITION RETURN 'a'
EXTERNAL_NAME NULL
EXTERNAL_LANGUAGE NULL
PARAMETER_STYLE SQL
IS_DETERMINISTIC NO
SQL_DATA_ACCESS CONTAINS SQL
SQL_PATH NULL
SECURITY_TYPE DEFINER
CREATED 2005-09-09 12:00:00
LAST_ALTERED 2005-09-09 12:00:00
SQL_MODE
ROUTINE_COMMENT
DEFINER user@localhost
Note that the data type information does not describe
the function's parameter -- it describes the data
type defined in the function's RETURNS clause.
The information is redundant, since a function's data type
etc. will also be retrievable via information_schema.parameters
for ordinal_position = 0. That's non-standard, but probably
most connectors will use information_schema.parameters, not
information_schema.routines, for this. See another worklog
task's high-level description, section "ORDINAL_POSITION = 0".
The documentation must emphasize that this is an "incompatible"
change, because applications might depend on the column order.
Minor task for Gluh; no further LLD needed.
sql_show.cc
add columns into T_FIELD_INFO proc_fields_info:
...
+ {"DATA_TYPE", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 0},
+ {"CHARACTER_MAXIMUM_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
+ {"CHARACTER_OCTET_LENGTH", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
+ {"NUMERIC_PRECISION", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
+ {"NUMERIC_SCALE", 21 , MYSQL_TYPE_LONG, 0, 1, 0},
+ {"CHARACTER_SET_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0},
+ {"COLLATION_NAME", 64, MYSQL_TYPE_STRING, 0, 1, 0},
+ {"DTD_IDENTIFIER", 65535, MYSQL_TYPE_STRING, 0, 1, 0},
...
Add into store_schema_proc() these columns handling.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.