summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/sql_select.cc14
-rw-r--r--sql/sql_show.cc1
-rw-r--r--sql/sql_show.h10
3 files changed, 19 insertions, 6 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 05c88a5f534..1fedf12b595 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -23490,16 +23490,19 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, table_map prefix_tab
const char *tmp_buff;
int f_idx;
StringBuffer<64> key_name_buf;
- if (is_table_read_plan->has_db_lookup_value())
+ if (is_table_read_plan->trivial_show_command ||
+ is_table_read_plan->has_db_lookup_value())
{
/* The "key" has the name of the column referring to the database */
f_idx= table_list->schema_table->idx_field1;
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
key_name_buf.append(tmp_buff, strlen(tmp_buff), cs);
}
- if (is_table_read_plan->has_table_lookup_value())
+ if (is_table_read_plan->trivial_show_command ||
+ is_table_read_plan->has_table_lookup_value())
{
- if (is_table_read_plan->has_db_lookup_value())
+ if (is_table_read_plan->trivial_show_command ||
+ is_table_read_plan->has_db_lookup_value())
key_name_buf.append(',');
f_idx= table_list->schema_table->idx_field2;
@@ -23630,8 +23633,9 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, table_map prefix_tab
else
eta->push_extra(ET_OPEN_FULL_TABLE);
/* psergey-note: the following has a bug.*/
- if (table_list->is_table_read_plan->has_db_lookup_value() &&
- table_list->is_table_read_plan->has_table_lookup_value())
+ if (table_list->is_table_read_plan->trivial_show_command ||
+ (table_list->is_table_read_plan->has_db_lookup_value() &&
+ table_list->is_table_read_plan->has_table_lookup_value()))
eta->push_extra(ET_SCANNED_0_DATABASES);
else if (table_list->is_table_read_plan->has_db_lookup_value() ||
table_list->is_table_read_plan->has_table_lookup_value())
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index bb8ae16189a..ec7d4979a4e 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -8035,6 +8035,7 @@ static bool optimize_for_get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond
if (lsel && lsel->table_list.first)
{
/* These do not need to have a query plan */
+ plan->trivial_show_command= true;
goto end;
}
diff --git a/sql/sql_show.h b/sql/sql_show.h
index 2f1cb26d17a..2b58fc45d4c 100644
--- a/sql/sql_show.h
+++ b/sql/sql_show.h
@@ -192,9 +192,17 @@ typedef struct st_lookup_field_values
class IS_table_read_plan : public Sql_alloc
{
public:
- IS_table_read_plan() : no_rows(false) {}
+ IS_table_read_plan() : no_rows(false), trivial_show_command(FALSE) {}
bool no_rows;
+ /*
+ For EXPLAIN only: For SHOW KEYS and SHOW COLUMNS, we know which
+ db_name.table_name will be read, however for some reason we don't
+ set the fields in this->lookup_field_vals.
+ In order to not have JOIN::save_explain_data() walking over uninitialized
+ data, we set trivial_show_command=true.
+ */
+ bool trivial_show_command;
LOOKUP_FIELD_VALUES lookup_field_vals;
Item *partial_cond;