Details
-
Task
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
None
Description
ST_FIELD_INFO is used to define INFORMATION_SCHEMA columns. A typical INFORMATION_SCHEMA table definition looks like this:
ST_FIELD_INFO schema_fields_info[]=
|
{
|
{"CATALOG_NAME", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, |
{"SCHEMA_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Database", |
SKIP_OPEN_TABLE},
|
{"DEFAULT_CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, |
SKIP_OPEN_TABLE},
|
{"DEFAULT_COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, |
SKIP_OPEN_TABLE},
|
{"SQL_PATH", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, |
{"SCHEMA_COMMENT", DATABASE_COMMENT_MAXLEN, MYSQL_TYPE_STRING, 0, 0, 0, |
SKIP_OPEN_TABLE},
|
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
|
};
|
It has two problems:
- It's not friently for user plugins, which may want to create INFORMATION_SCHEMA tables with their own data types.
- When a Field is created inside Type_handler_xxx::make_schema_field(), strlen() is called for ST_FIELD_INFO::field_name, for every column, every time an INFORMATION_SCHEMA query is done. This is not performance wise.
To solve these problems let do the following:
- Add a namespace Show
- Add a helper class Show::Column
- Add a number of Show classes for various data types, with this hierarchy:
Type
Blob
Varchar
Yesno
Catalog
Name
Definer
Userhost
CSName
SQLMode
Longtext
Datetime
Decimal
ULonglong
ULong
SLonglong
SLong
SShort
STiny
Double
This will hide internal implementation details of ST_FIELD_INFO from the upper level code. An INFORMATION_SCHEMA table definition will look like this:
namespace Show { |
 |
ST_FIELD_INFO schema_fields_info[]=
|
{
|
Column("CATALOG_NAME", Catalog(), NOT_NULL), |
Column("SCHEMA_NAME", Name(), NOT_NULL, "Database"), |
Column("DEFAULT_CHARACTER_SET_NAME", CSName(), NOT_NULL), |
Column("DEFAULT_COLLATION_NAME", CSName(), NOT_NULL), |
Column("SQL_PATH", Str(FN_REFLEN), NULLABLE), |
Column("SCHEMA_COMMENT", Str(DATABASE_COMMENT_MAXLEN), NOT_NULL), |
CEnd()
|
};
|
...
|
} // namespace Show |
This task covers the code in /sql and /plugins.
As the next step, in separate patchs, we'll do the following:
- Fix the code in /storage to use the new classes instead of direct ST_FIELD_INFO initialization.
- In ST_FIELD_INFO, replace enum_field_types field_type to const Type_handler *handler.
- In ST_FIELD_INFO, replace const char *field_name to LEX_CSTRING field_name.
which will solve the two mentioned problems.
Attachments
Issue Links
- blocks
-
MDEV-4912 Data type plugin API version 1
- Closed
-
MDEV-19810 Reuse new I_S table definition helper classes for InnoDB
- Closed
-
MDEV-19818 Reuse new I_S table definition helper classes for TokuDB
- Closed
-
MDEV-19832 Reuse new I_S table definition helper classes for Spider
- Closed
-
MDEV-19833 Reuse new I_S table definition helper classes for Mronga
- Closed
-
MDEV-19836 Reuse new I_S table definition helper classes for RocksDB
- Closed
-
MDEV-19843 Modify ST_FIELD_INFO to use Type_handler and LEX_CSTRING
- Closed