From a8458a2345ea2497ada2f1bd01aeb9c34934dfc6 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 8 Jul 2020 16:26:34 +0200 Subject: [PATCH] MDEV-21201 No records produced in information_schema query, depending on projection In case of NATURAL JOIN / USING mark all field (one table can not be opened in any case so optimisation does not worth it). IMHO table should be checked for used fields and filled after prepare, when we will fave whole info about used fields but it is too big change for a bugfix. Which will be made later by Serg patch --- mysql-test/main/information_schema.result | 64 +++++++++++++++++++++++ mysql-test/main/information_schema.test | 62 ++++++++++++++++++++++ sql/sql_parse.cc | 2 + sql/sql_show.cc | 5 +- sql/table.h | 1 + 5 files changed, 133 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 62a563bf483..20b5985deb6 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2201,3 +2201,67 @@ SCHEMA_NAME # # End of 10.1 tests # +# +# MDEV-21201:No records produced in information_schema query, +# depending on projection +# +create table t (i int, constraint a check (i > 0)); +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc +join information_schema.CHECK_CONSTRAINTS cc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc +join information_schema.TABLE_CONSTRAINTS tc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc +NATURAL join information_schema.CHECK_CONSTRAINTS cc +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc +NATURAL join information_schema.TABLE_CONSTRAINTS tc +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE, +tc.CONSTRAINT_CATALOG, +tc.CONSTRAINT_SCHEMA +from information_schema.TABLE_CONSTRAINTS tc +join information_schema.CHECK_CONSTRAINTS cc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE CONSTRAINT_CATALOG CONSTRAINT_SCHEMA +test t a `i` > 0 def test +drop table t; +# +# End of 10.3 tests +# diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index 08eeef5aa90..d97aed0e0f2 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -1922,3 +1922,65 @@ SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a' --echo # --echo # End of 10.1 tests --echo # + + +--echo # +--echo # MDEV-21201:No records produced in information_schema query, +--echo # depending on projection +--echo # + +create table t (i int, constraint a check (i > 0)); + +--disable_warnings +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc + join information_schema.CHECK_CONSTRAINTS cc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc + join information_schema.TABLE_CONSTRAINTS tc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc + NATURAL join information_schema.CHECK_CONSTRAINTS cc +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc + NATURAL join information_schema.TABLE_CONSTRAINTS tc +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE, + tc.CONSTRAINT_CATALOG, + tc.CONSTRAINT_SCHEMA +from information_schema.TABLE_CONSTRAINTS tc + join information_schema.CHECK_CONSTRAINTS cc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +--enable_warnings + +drop table t; + +--echo # +--echo # End of 10.3 tests +--echo # diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac73b5e9cdf..6802816caaf 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -8904,6 +8904,8 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List *using_fields, SELECT_LEX *lex) { b->natural_join= a; + a->part_of_natural_join= TRUE; + b->part_of_natural_join= TRUE; lex->prev_join_using= using_fields; } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3dbc7724928..c6e801b7976 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8183,7 +8183,10 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) else all_items= thd->free_list; - mark_all_fields_used_in_query(thd, fields_info, &bitmap, all_items); + if (table_list->part_of_natural_join) + bitmap_set_all(&bitmap); + else + mark_all_fields_used_in_query(thd, fields_info, &bitmap, all_items); for (field_count=0; fields_info->field_name; fields_info++) { diff --git a/sql/table.h b/sql/table.h index a5821a712c6..3d289bf241a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -2183,6 +2183,7 @@ struct TABLE_LIST parsing 'this' is a NATURAL/USING join iff (natural_join != NULL). */ TABLE_LIST *natural_join; + bool part_of_natural_join; /* True if 'this' represents a nested join that is a NATURAL JOIN. For one of the operands of 'this', the member 'natural_join' points