WL#9570: Extend SHOW statements to list hidden columns and index information.
Affects: Server-8.0
—
Status: Complete
INFORMATION_SCHEMA tables are implemented as a views on the new
data dictionary tables in 8.0. But view definition for
COLUMNS, STATISTICS and KEY_COLUMN_USAGE do not check the hidden
column value from the dictionary tables for columns, indexes and
index elements. Hence hidden columns, indexes and index elements
are displayed by these INFORMATION_SCHEMA tables.
SHOW statements implementation uses the INFORMATION_SCHEMA tables.
So even SHOW statements displays the hidden column, index and
index elements.
The main goal of this WL are to,
i) show columns, indexes and index element's information
which are not hidden from the tables of INFORMATION_SCHEMA
and SHOW statements.
ii) Extend SHOW statements to list hidden columns and indexes
and index elements on demand.
User Documentation
==================
* https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-2.html
* https://dev.mysql.com/doc/refman/8.0/en/show-columns.html
* https://dev.mysql.com/doc/refman/8.0/en/show-index.html
F-1: INFORMATION_SCHEMA.COLUMNS should not show the hidden columns.
INFORMATION_SCHEMA.COLUMNS lists all the columns of the
table. View definition of the INFORMATION_SCHEMA.COLUMNS
should be modified to check hidden column value from data
dictionary table "columns" and display only columns of
the tables which are not hidden.
For example, the following hidden columns for the
any table to the mysql.columns,
DB_TRX_ID,
DB_ROLL_PTR
These and such hidden columns should not be listed by the
INFORMATION_SCHEMA.COLUMNS.
F-2: INFORMATION_SCHEMA.STATISTICS* should not display hidden
indexes and index elements.
INFORMATION_SCHEMA.STATISTICS* lists all the index and
index elements defined on the table. View definition of
INFORMATION_SCHEMA.STATISTICS* should me modified to
check hidden column value from the data dictionary tables
"indexes" and "index_column_usage" and display only
index and index elements which are not hidden.
For example, hidden indexes on the hidden columns
(mentioned in F-1) in the mysql.indexes.
Such hidden indexes should not be listed by the
INFORMATION_SCHEMA.STATISTICS*.
F-3: INFORMATION_SCHEMA.KEY_COLUMN_USAGE should not display hidden
indexes and index elements.
INFORMATION_SCHEMA.KEY_COLUMN_USAGE lists all the index and
index elements defined on the table. View definition of
INFORMATION_SCHEMA.KEY_COLUMN_USAGE should be modified to
check hidden column value from the data dictionary tables
"indexes" and "index_column_usage" and display only
index and index elements which are not hidden.
For example, creates hidden indexes on the hidden
columns (mentioned in F-1) in the mysql.indexes.
Such hidden indexes and its elements should not be listed by
the INFORMATION_SCHEMA.KEY_COLUMN_USAGE.
F-4: SHOW [ FULL ] COLUMNS should not list the hidden columns.
SHOW [ FULL ] COLUMNS lists all the columns from the
table. SHOW COLUMNS uses INFORMATION_SCHEMA table "COLUMNS"
to list the COLUMNS of the table. With F-1 changes, SHOW
COLUMNS by default lists only columns which are not hidden.
F-5: SHOW INDEX should not list the hidden index and
index elements.
SHOW INDEX lists all the index and index elements information
defined on the table.
SHOW INDEX uses INFORMATION_SCHEMA table "STATISTICS"
to list the index and index elements defined on the table.
With F-2 changes, SHOW INDEX by default lists only
index and index elements which are hidden.
F-6: SHOW EXTENDED [ FULL ] COLUMNS should also list hidden
columns of the table.
By default SHOW COLUMNS should display only columns
which are not hidden.
To get hidden columns too, EXTENDED keyword should be
introduced to SHOW COLUMNS statement.
F-7: SHOW EXTENDED INDEX should also list hidden index and index
elements.
By default SHOW INDEX should display only index and
index elements which are not hidden. To get hidden index
and index elements too, EXTENDED keyword should be
introduced to SHOW INDEX statement.
Columns, index and index elements are marked as hidden by storing
value "true" in the column "hidden" of the data dictionary tables
"columns", "indexes" and "index_column_usage". Using this, following
modifications are done to list only columns, indexes and index
elements which are not hidden in INFORMATION_SCHEMA queries, SHOW
statements and list hidden columns, indexes and index elements
too with SHOW EXTENDED.
Display non-hidden columns, index and index elements:
--------------------------------------------------------
Following modifications are done to display only columns,
index and index elements which are not hidden by checking the hidden
column values from the dictionary table(s).
1) Modification to Native methods:
----------------------------------
Native methods CAN_ACCESS_COLUMN() and CAN_ACCESS_TABLE() are
modified to either skip or display rows. New parameter is
introduced to these methods to skip rows for INFORMATION_SCHEMA
query. Row is skipped if value of this parameter is true.
New signature of these native methods are as below,
1.a) CAN_ACCESS_TABLE:
Existing:
int CAN_ACCCESS_TABLE(schema_name, table_name);
New:
int CAN_ACCCESS_TABLE(schema_name, table_name,
skip_table);
1.b) CAN_ACCESS_COLUMN:
Existing:
int CAN_ACCCESS_COLUMN(schema_name,
table_name,
field_name);
New:
int CAN_ACCCESS_COLUMN(schema_name,
table_name,
field_name,
skip_column);
2) Modification INFORMATION_SCHEMA tables:
------------------------------------------
View definition of INFORMATION_SCHEMA tables are modified
to skip hidden columns, index and index elements by using
the new parameter introduced for CAN_ACCCESS_TABLE and
CAN_ACCESS_COLUMN method.
View definition of INFORMATION_SCHEMA tables is modified as
below,
2.a) INFORMATION_SCHEMA.COLUMNS:
================================
COLUMNS view definition is modified as below to invoke
native function CAN_ACCESS_COLUMN() with columns.hidden
column value as below,
CREATE OR REPLACE DEFINER=`root`@`localhost` VIEW
information_schema.COLUMNS AS
...
WHERE INTERNAL_GET_VIEW_WARNING_OR_ERROR(sch.name, tbl.name,
tbl.type, tbl.options) AND
CAN_ACCESS_COLUMN(sch.name, tbl.name, col.name,
col.hidden)
...
2.b) INFORMATION_SCHMEA.STATISTICS*:
=======================================
STATISTICS* view definition is modified as below to invoke
native function CAN_ACCESS_TABLE() with index.hidden and
index_column_usage.hidden column values as below,
CREATE OR REPLACE DEFINER=`root`@`localhost` VIEW
information_schema.STATISTICS_BASE
...
WHERE CAN_ACCESS_TABLE(sch.name, tbl.name,
idx.hidden OR icu.hidden)
...
2.c) INFORMATION_SCHEMA.KEY_COLUMN_USAGE:
=========================================
KEY_COLUMN_USAGE view definition is modified as below to invoke
native function CAN_ACCESS_COLUMN() with columns.hidden,
indexes.hidden and index_column_usage.hidden column values
as below,
CREATE OR REPLACE DEFINER=`root`@`localhost` VIEW
information_schema.KEY_COLUMN_USAGE
...
WHERE CAN_ACCESS_COLUMN(sch.name, tbl.name, col.name,
col.hidden OR idx.hidden OR
icu.hidden) AND
...
UNION
(SELECT cat.name ", @collate_tolower, " AS CONSTRAINT_CATALOG,
...
WHERE CAN_ACCESS_COLUMN(sch.name, tbl.name, col.name,
col.hidden OR idx.hidden OR
icu.hidden)
...
2.d) INFORMATION_SCHEMA.TABLE_CONSTRAINTS:
===========================================
TABLE_CONSTRAINTS view definition is modified as below to
invoke native function CAN_ACCESS_TABLE() with indexes.hidden
column values as below,
CREATE OR REPLACE DEFINER=`root`@`localhost` VIEW
information_schema.TABLE_CONSTRAINTS
...
WHERE CAN_ACCESS_TABLE(sch.name, tbl.name, idx.hidden)
...
In other view definitions of INFORMATION_SCHEMA tables
value FALSE is passed to the new parameter.
With this change only non-hidden columns, indexes and index
elements are displayed by the INFORMATION_SCHEMA tables and
by SHOW operations (as it uses the modified INFORMATION_SCHEMA
tables).
Display hidden columns, index and index elements on Demand:
-----------------------------------------------------------
By default INFORMATION_SCHEMA tables and SHOW statements does not
list the hidden columns, index and index elements. But these
information can be listed on demand from the SHOW statements.
New optional keyword EXTENDED is introduced to the SHOW COLUMNS
and INDEX to even list the hidden columns, index and index elements.
1 SHOW COLUMNS:
===============
SHOW COLUMNS with EXTENDED option displays the hidden columns
from the table.
New Syntax of SHOW COLUMNS:
SHOW [EXTENDED] [FULL] COLUMNS {FROM | IN} tbl_name
[{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
2 SHOW INDEX:
===============
SHOW INDEX with EXTENDED option displays the hidden index and
index elements of the table.
New Syntax of SHOW INDEX:
SHOW [EXTENDED] {INDEX | INDEXES | KEYS}
{FROM | IN} tbl_name
[{FROM | IN} db_name]
[WHERE expr]
New member m_extended_show of bool type in the LEX is set to
true when EXTENDED is used with SHOW COLUMNS and SHOW INDEX.
EXTENDED keyword(LEX::m_extended_show) overrides the skip_column
and skip_table parameter value in Native methods CAN_ACCESS_COLUMN
and CAN_ACCESS_TABLE respectively.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.