WL#7167: Change DDL to update rows for view columns in DD.COLUMNS and other dependent values.
Affects: Server-8.0
—
Status: Complete
Schema of new data dictionary assumes that a) Rows with information about view columns are stored in the mysql.COLUMNS table while creating the view. b) Rows with information about view columns in the mysql.COLUMNS are updated each time type of view column changes, i.e. each time when type of columns in one of the base table changes. c) Each time when view becomes updatable or non-updatable column mysql.TABLE.IS_UPDATABLE is updated. d) Each time when keys in parent table changes then mysql.FOREIGN_KEYS.UNIQUE_CONSTRAINT_ID is updated. INFORMATION_SCHEMA.COLUMNS is modified to list information from the New DD table mysql.COLUMNS. In the current code only information about columns of Tables are stored in the mysql.COLUMNS table. Hence INFORMATION_SCHMEA.COLUMNS lists only columns of Tables. Columns of views are not listed. Even "SHOW COLUMNS" from views does not list column information. As part of this WL, view's column information is stored into the DD table mysql.COLUMNS. Even implementation of DDL statements affecting underlying tables of view is extended to update view columns information in mysql.COLUMNS and mysql.TABLE.IS_UPDATABLE. Note: Extending Add user, Drop user, Grant and revoke statements to update view validity is outside the scope of this WL. DDL operations extended to update view columns are not automic, there is a possibility of things going out of sync in fatal error or crash scenarios. Making these operations automic is outside scope of this WL.
F-1: Create/Alter VIEW statement must store rows with information
about view columns in the mysql.COLUMNS table.
As of now, rows with information about view columns are not
stored in the mysql.COLUMNS table.
As part of this WL, modify View Creation and alter code to store
the rows with view columns information in mysql.COLUMNS table.
F-2: Create/Alter VIEW statement must store information about the base
tables and views used by a view in the mysql.VIEW_TABLE_USAGE table.
This work is mostly about storing base tables and views
used in the FROM clause of a view query in mysql.VIEW_TABLE_USAGE
table.
F-3: Create/Alter VIEW statement must store information about stored
function used by the view query in mysql.VIEW_ROUTINE_USAGE table.
This work is about introducing new DD table VIEW_ROUTINE_USAGE
and storing Stored functions used by the views.
Definition of mysql.VIEW_ROUTINE_USAGE:
view_id BIGINT UNSIGNED NOT NULL,
routine_catalog VARCHAR(64) NOT NULL COLLATE utf8_bin/utf8_tolower_ci,
routine_schema VARCHAR(64) NOT NULL COLLATE utf8_bin/utf8_tolower_ci,
routine_name VARCHAR(64) NOT NULL COLLATE utf8_general_ci,
PRIMARY KEY (view_id, routine_catalog, routine_schema, routine_name),
FOREIGN KEY (view_id) REFERENCES tables(id),
KEY (routine_catalog, routine_schema, routine_name)
F-4: Drop VIEW must drop information stored for view in mysql.COLUMNS,
mysql.VIEW_TABLE_USAGE and mysql.VIEW_ROUTINE_USAGE tables.
F-5: Alter base table to change column type must update the view column
type.
This work is mostly about finding all the views using base
table from mysql.VIEW_TABLE_USAGE and update view columns information
using the new column type.
View columns information update operation is transitive as views
depending updated views are also updated and so on until there are
no more dependent views.
F-6: Following DDL operations must update view status as "INVALID",
- Alter base table to drop or rename column used by view.
- Drop or rename base table.
- Drop or rename view.
- Alter view used in FROM clause of view query.
This work is mostly about finding all the views using base table or
view being used in DDL operations mentioned above from the
mysql.VIEW_TABLE_USAGE table and update status of those view as
"INVALID".
View status update operation is transitive as views depending
updated views are also updated and so on until there are
no more dependent views.
F-7: Following DDL operations must update view status as "VALID",
- Alter base table to add or rename column.
- Create or rename base table.
- Create or rename View.
- Alter view used in FROM clause of view query.
This work is mostly about finding all the views using base table or
view being used in DDL operations mentioned above from the
mysql.VIEW_TABLE_USAGE table. Check if view query can be prepared
correctly with new definition of table or view. If yes then
update all view columns, insert view column information if
they are missing and mark status of the view as "VALID".
View status update operation is transitive as views depending
updated views are also updated and so on until there are
no more dependent views.
F-8: Stored function drop must set state of views using it as invalid.
This work is mostly about finding all the views using the
stored function in mysql.VIEW_ROUTINE_USAGE table and mark view
as invalid.
View status update operation is transitive as views depending
updated views are also updated and so on until there are
no more dependent views.
F-9: Create stored function with same name as stored function used by
views in invalid state must update view status.
This work is mostly about finding all the view using stored
function with same name in mysql.VIEW_ROUTINE_USAGE table.
Check if view query can be prdepared correctly. If yes then
update all view columns, insert view column information if
they are missing and mark status of the view as "VALID".
View status update operation is transitive as views depending
updated views are also updated and so on until there are
no more dependent views.
F-10: Drop database must set state as "invalid" for all the views using
table/views/stored functions defined in the database being dropped.
F-11: SELECT on INFORMATION_SCHEMA.COLUMNS should display columns of
views.
F-12: Proper Warning and Note messages should be reported for SELECT
on INFORMATION_SCHEMA.COLUMNS of views, if view is invalid.
This work is mostly about checking status of each view whose
columns are listed by SELECT on INFORMATION_SCHEMA.COLUMNS.
If view state is invalid then report proper warning or note
messages.
F-13: SHOW COLUMNS from views should display columns of views.
F-14: Proper warning or error messages should be reported for
SHOW COLUMNS on INVALID views.
F-15: Create view must update is_updatable state of it and also update
is_updatable state of views using it.
This work is mostly about finding all the views using View
being created. Check if each view is still updatable or not
with new view definition and update the same in column
mysql.TABLES.IS_UPDATABLE.
F-16: Rename view update is_updatable state of views referencing it.
This work is mostly about finding all the views using new view name
used in RENAME operation. Check if each view is still updatable
or not with the view definition and update the same in column
mysql.TABLES.IS_UDPATABLE.
F-17: Alter index of parent table must update
mysql.FOREIGN_KEYS.UNIQUE_CONSTRAINT_ID
of child table.
New Data Dictionary assumes that rows with view column information is
stored in the New DD table mysql.COLUMNS and updated each time type of view
column changes i.e. type of column in one of the base table changes.
Similar assumptions are made about mysql.VIEWS.IS_UPDATABLE and about
mysql.FOREIGN_KEYS.UNIQUE_CONSTRAINT_ID. As part of WL these assumptions
are implemented.
A) Handling View column Information:
==============================================
INFORMATION_SCHEMA.COLUMNS is modified to list information from the New DD
table mysql.COLUMNS. In the current code only information about columns of
Tables are stored in the mysql.COLUMNS table. Hence INFORMATION_SCHEMA.COLUMNS
lists only columns of Tables. Columns of views are not listed. Even "SHOW
COLUMNS" from views does not list column information. As part of this WL, view
code is modified to insert rows with view's column information in DD table
mysql.COLUMNS.
A.a) Changes to View Creation code(F-1 to F-4, F-11 and F-13):
--------------------------------------------------------------
To insert rows with view column information in mysql.COLUMNS
following changes are introduced in the View Create code,
*) Similar to CREATE TABLE .. SELECT method, from the SELECT_LEX
prepared for a view query Create_field objects are created.
Fields Items of SELECT_LEX is used to prepare Create_field
objects.
*) DD::View object has collection object to hold the column
information. Create_field objects prepared from the SELECT_LEX
of the query are used to populate column information in DD::Views
object. Existing method DD::fill_dd_columns_from_create_fields()
to store column information for tables is called for views as
well to store column information.
*) store() method of View object is used to store columns of View
similar to Table object.
Note: In the current code, alter view operation drops exiting view
information from the DD table and inserts new View object
created with the new definition. Hence with the above changes
to create code, rows with column's information prepared from
new view definition are inserted to mysql.COLUMNS table while
altering the view.
For the view column, metadata columns name and ordinal positions
are related to the view. Followings metadata columns are related to
the base table, view's column, stored function return type or
evaluated type for expressions,
type
is_nullable
is_zerofill
is_unsigned
char_length
numeric_precision
numeric_scale
datetime_precision
colletion_id
has_no_default
default_value
default_value_utf8
default_option
update_option
column_type_utf8
Other columns are set to NULL.
With these changes, INFORMATION_SCHEMA.COLUMNS and "SHOW COLUMNS"
list columns from the view as well.
To find views using table, view and stored function, information
about these objects used by views is stored in the tables
mysql.VIEW_TABLE_USAGE and mysql.VIEW_ROUTINE_USAGE while creating/
Altering the view.
*) While preparing DD::View object for a view, View_table collection
type object is populated with Table names and View names used
by the view.
store() implementation for views stores view to base table and
views used in view query relation in DD table
mysql.VIEW_TABLE_USAGE.
*) New table mysql.VIEW_ROUTINE_USAGE is introduced to store the
relation between view and stored functions used by it.
While preparing DD::View object for view, stored functions
used by views are stored with new collection type member
View_routines of DD::View.
store() implementation for views stores view to stored function
relation in new DD table mysql.VIEW_ROUTINE_USAGE.
Note: drop() implementation for view, drops View_table and
View_routine collection object's content too. Which removes
entries for view from VIEW_TABLE_USAGE and
VIEW_ROUTINE_USAGE tables.
A.b) View column type update (F-5):
-----------------------------------
For ALTER TABLE operation after successfully altering the table and
removing the back up of the old table, column information of all
the views referencing altered table are modified.
For ALTER VIEW after storing the new definition by calling method
mysql_register_view() column information of all the views
referencing alter table are modified.
For ALTER TABLE/VIEW operation following changes is introduced to
modify column information of all the views using it,
a) Read views using base table or view from the information stored
in mysql.VIEW_TABLE_USAGE. Modification to view column metadata
might affect others views referencing them. So read all the views
referencing listed views and so on, until no more dependent
views are found.
b) Columns of all the views are updated as below once the changes
to table or view is completed.
b.1) Open all views listed with MDL lock request type
MDL_EXCLUSIVE.
Note: In Lock table mode, while opening views and its
base table lock table mode is temporarily disabled
by setting LTM_NONE.
These tables are closed explicitly in
close_thread_tables().
If view open fails with DEADLOCK or LOCK TIMEOUT issue
then error is reported and transaction is rolled back.
b.2) Prepare SELECT_LEX for view query with new definition
of table view.
b.3) Update view columns metadata using current ALTER VIEW
code i.e. by calling mysql_register_view(VIEW_ALTER).
A.c) Handling View status(VALID/INVALID) (F-6 to F-10):
--------------------------------------------------------
There is a possibility of view(s) becoming INVALID because DDL
operations on the base tables, views and stored functions used
by it.
Following table contains DDL operations on the base table, view and
stored functions because of which view can become INVALID. Following
tables even has list of DDL operations because of which INVALID
view can become VALID again.
+-------------------------------+--------------------------------+
|DDLs sets state to 'INVALID' | DDLs reset state to 'VALID' |
| | |
|-------------------------------+--------------------------------|
| | |
|ALTER TABLE org_tbl DROP | ALTER TABLE org_tbl CHANGE |
| COLUMN org_col; | any_col TO |
| | org_col ; |
|(Drop columns referenced by | (Rename any column to Column |
| views from the base table) | name referenced from the |
| | base tables by the views) |
| | |
| | |
| | ALTER TABLE org_tbl |
| | ADD org_col INT |
| | (Add new column with name |
| | referenced from the base |
| | base table by the views) |
| | |
|-------------------------------+--------------------------------|
| | |
|DROP TABLE org_tbl | CREATE TABLE org_tbl ... |
|(Drop base table used by views)| (Create new table "org_tbl" |
| | with same name for the |
| | columns referenced by views) |
| | |
| | RENAME TABLE any_tbl to |
| | org_tbl; |
| | (Rename any table having same |
| | column names referenced |
| | by the views to the table |
| | name "org_tbl") |
| | |
|-------------------------------+--------------------------------|
|RENAME TABLE org_tbl to any_tbl| CREATE TABLE org_tbl ... |
|(Rename tables referenced by | (Create new table "org_tbl" |
| view to any_tbl) | with same names for the |
| | columns referenced by views) |
| | |
| | RENAME TABLE any_tbl to |
| | org_tbl; |
| | (Rename any table having same |
| | column names referenced by |
| | views to the table name |
| | "org_tbl") |
| | |
|-------------------------------+--------------------------------|
|ALTER VIEW new_query | ALTER VIEW old_query |
|(Change names of the View | (Change names of the view |
| columns or Drop View columns | columns or add new columns |
| referenced by other views) | with same name referenced |
| | by other views) |
| | |
|-------------------------------+--------------------------------|
|DROP VIEW org_vw | CREATE VIEW org_vw |
|(DROP view org_vw referenced by| (Org_vw having view query |
| other views) | with the same name for |
| | columns) |
| | |
| | RENAME TABLE any_vw to org_vw |
| | (Rename any view having same |
| | column name referenced by |
| | other views to the view name |
| | "org_vw") |
| | |
|-------------------------------+--------------------------------|
|DROP STORED FUNCTION sf | CREATE STORED FUNCTION sf |
|(All views using stored | (sf with same name and |
| function 'sf' in view query | parameters) |
| will be INVALID) | |
| | |
+-------------------------------+--------------------------------+
|DROP DATABASE org_db | Recreate org_db with same |
|(All views referencing table, | name for table, view having |
| view or store function objects| same name for column and |
| from db be INVALID) | stored function with same |
| | name and parameter. |
| | |
+-------------------------------+--------------------------------+
When view is invalid, proper warning message is reported by the
SELECT on INFORMATION_SCHEMA.COLUMNS and error message by
"SHOW COLUMNS".
State of the view is stored in mysql.TABLES.options. Option
introduced to store state of the view is "view_valid".
For all these operations, method mentioned above in A.b is used
with some additional changes to update view status.
A.c.1) For DDL operations on the Base Table or View:
----------------------------------------------------
Following changes are done to update view columns and view status
(Additional changes are highlighted with **)
a) Read views using base table or view from the information
stored in mysql.VIEW_TABLE_USAGE. Modification to view column
metadata might affect others views referencing them. So read
all the views referencing listed views and so on, until no
more dependent views are found.
b) Columns of all the views are updated as below once the changes
to table or view is completed.
**b.1) If Base table or View is dropped then mark all views
using it as "INVALID" after acquiring MDL_EXCLUSIVE
lock on views.
b.2) Otherwise Open all views listed with MDL lock request
type MDL_EXCLUSIVE.
Note: In Lock table mode, while opening views and its
base table lock table mode is temporarily disabled
by setting LTM_NONE.
These tables are closed explicitly in
close_thread_tables().
If view open fails with DEADLOCK or LOCK TIMEOUT issue
then error is reported and transaction is rolled back.
b.3) Prepare SELECT_LEX for view query with new definition
of table/view.
**b.4) If b.3 step fails because of changes to base table or
view definition then mark View as INVALID.
b.5) Update view columns metadata using current ALTER VIEW
code i.e by calling mysql_register_view(VIEW_ALTER).
**b.6) If view state was INVALID before mark it as VALID.
A.c.2) For DDL operations on the stored functions:
--------------------------------------------------
For DDL operations related to Stored functions following code
changes are introduced to CREATE and DROP Stored functions,
a) Read views using stored function from the information stored
in mysql.VIEW_ROUTINE_USAGE. Modification to view column metadata
might affect others views referencing them. So read all the views
referencing listed views form mysql.VIEW_TABLE_USAGE and so on,
until no more dependent views are found.
b) Views are marked as VALID or INVALID as below
b.1) If stored function is dropped then mark all views using
it as "INVALID" after acquiring MDL_EXCLUSIVE lock on
views.
b.2) Otherwise Open all views listed with MDL lock request
type MDL_EXCLUSIVE.
Note: In Lock table mode, while opening views and its base
table lock table mode is temporarily disabled by
setting LTM_NONE.
These tables are closed explicitly in
close_thread_tables().
If view open fails with DEADLOCK or LOCK TIMEOUT issue
then error is reported and transaction is rolled back.
b.3) Prepare SELECT_LEX for view query with new definition of
Stored function.
b.4) If b.3 fails because of changes to stored function
definition then mark view as INVALID.
b.5) Update view columns metadata using current ALTER VIEW
code i.e. by calling mysql_register_view(VIEW_ALTER).
b.6) If view state was INVALID before mark it as VALID.
A.d) UDF to check view status (F-12, F-14):
--------------------------------------------
To verify VIEW state new UDF function
"INTERNAL_CHECK_VIEW_WARNINGS_OR_ERROR" is introduced. This function
check view status and then report WARNING or NOTE message. UDF
function is used in the view query of INFORMATION_SCHEMA.COLUMN.
SHOW COLUMN uses same function to report a NOTE or error message.
View column information stored in mysql.columns table and view_valid
value from options, is used by query INFORMATION_SCHEMA views and SHOW
statements.
B) Handling mysql.TABLE.IS_UPDATABLE(F-15, F-16):
=================================================
Information about view is updatable or not updatable is stored in the
DD table while Creating or Altering the view. But if view is using
another view in the query then there is chance that view becomes
updatable or not-updatable depending the other views updatable status.
In the current code, view updatable information is not handled in such
cases.
Following change is introduced to update IS_UPDATABLE value of view
using view being altered,
B.a) Read views using base table or view from the information stored
in mysql.VIEW_TABLE_USAGE. Modification to view column metadata
might affect others views referencing them. So read all the views
referencing listed views and so on, until no more dependent
views are found.
B.b) Views are marked as updatable or non-updatable as below,
b.1) Open all views listed with MDL lock request type
MDL_EXCLUSIVE.
Note: In Lock table mode, while opening views and its base
table lock table mode is temporarily disabled by
setting LTM_NONE.
These tables are closed explicitly in
close_thread_tables().
If view open fails with DEADLOCK or LOCK TIMEOUT issue
then error is reported and transaction is rolled back.
b.2) Prepare SELECT_LEX for view query with new definition of
view being altered.
b.3) Mark view is updatable or non-updatable depending on
the new definition of view being altered.
b.4) Update view metadata using current ALTER VIEW code
i.e. by calling mysql_register_view(VIEW_ALTER).
C) Handling mysql.FOREIGN_KEYS.UNIQUE_CONSTRAINT_ID(F-17):
=======================================================
Currently mysql.FOREIGN_KEYS table is not used.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.