summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_parse.cc3
-rw-r--r--sql/sql_show.cc29
-rw-r--r--sql/table.h2
3 files changed, 32 insertions, 2 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index ead6235461e..a7a6b660dd6 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -8894,6 +8894,9 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List<String> *using_fields,
SELECT_LEX *lex)
{
b->natural_join= a;
+ a->part_of_natural_join= TRUE;
+ b->join_using= using_fields;
+ a->join_using= using_fields;
lex->prev_join_using= using_fields;
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 3dbc7724928..52b367dfe4b 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -8094,7 +8094,8 @@ static void
mark_all_fields_used_in_query(THD *thd,
ST_FIELD_INFO *schema_fields,
MY_BITMAP *bitmap,
- Item *all_items)
+ Item *all_items,
+ List<String> *join_using)
{
Item *item;
DBUG_ENTER("mark_all_fields_used_in_query");
@@ -8132,6 +8133,25 @@ mark_all_fields_used_in_query(THD *thd,
}
}
}
+ if (join_using)
+ {
+ List_iterator_fast<String> it(*join_using);
+ String *nm;
+ while ((nm= it++))
+ {
+ ST_FIELD_INFO *fields= schema_fields;
+ uint count;
+ for (count=0; fields->field_name; fields++, count++)
+ {
+ if (!my_strcasecmp(system_charset_info, fields->field_name,
+ nm->ptr()))
+ {
+ bitmap_set_bit(bitmap, count);
+ break;
+ }
+ }
+ }
+ }
DBUG_VOID_RETURN;
}
@@ -8183,7 +8203,12 @@ 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->natural_join || table_list->part_of_natural_join) &&
+ table_list->join_using == NULL)
+ bitmap_set_all(&bitmap);
+ else
+ mark_all_fields_used_in_query(thd, fields_info, &bitmap, all_items,
+ table_list->join_using);
for (field_count=0; fields_info->field_name; fields_info++)
{
diff --git a/sql/table.h b/sql/table.h
index d289b6e0ab2..a0a535dbf31 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -2182,6 +2182,8 @@ struct TABLE_LIST
parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
*/
TABLE_LIST *natural_join;
+ List<String> *join_using;
+ 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