Commit a8458a23 authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

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
parent 78c2a5ab
...@@ -2201,3 +2201,67 @@ SCHEMA_NAME ...@@ -2201,3 +2201,67 @@ SCHEMA_NAME
# #
# End of 10.1 tests # 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
#
...@@ -1922,3 +1922,65 @@ SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a' ...@@ -1922,3 +1922,65 @@ SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a'
--echo # --echo #
--echo # End of 10.1 tests --echo # End of 10.1 tests
--echo # --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 #
...@@ -8904,6 +8904,8 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List<String> *using_fields, ...@@ -8904,6 +8904,8 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List<String> *using_fields,
SELECT_LEX *lex) SELECT_LEX *lex)
{ {
b->natural_join= a; b->natural_join= a;
a->part_of_natural_join= TRUE;
b->part_of_natural_join= TRUE;
lex->prev_join_using= using_fields; lex->prev_join_using= using_fields;
} }
......
...@@ -8183,7 +8183,10 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) ...@@ -8183,7 +8183,10 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list)
else else
all_items= thd->free_list; 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++) for (field_count=0; fields_info->field_name; fields_info++)
{ {
......
...@@ -2183,6 +2183,7 @@ struct TABLE_LIST ...@@ -2183,6 +2183,7 @@ struct TABLE_LIST
parsing 'this' is a NATURAL/USING join iff (natural_join != NULL). parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
*/ */
TABLE_LIST *natural_join; TABLE_LIST *natural_join;
bool part_of_natural_join;
/* /*
True if 'this' represents a nested join that is a 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 For one of the operands of 'this', the member 'natural_join' points
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment