Commit d161546b authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-6689: valgrind errors in view.test in 10.1

SHOW COLUMNS and SHOW KEYS commands fill IS_table_read_plan
in a special way - they don't set or use lookup_field_vals
member.

Added a "trivial_show_command" flag that signals that
lookup_field_vals has no valid data, made EXPLAIN code honor it.
parent e44751b6
...@@ -23490,16 +23490,19 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, table_map prefix_tab ...@@ -23490,16 +23490,19 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, table_map prefix_tab
const char *tmp_buff; const char *tmp_buff;
int f_idx; int f_idx;
StringBuffer<64> key_name_buf; 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 */ /* The "key" has the name of the column referring to the database */
f_idx= table_list->schema_table->idx_field1; f_idx= table_list->schema_table->idx_field1;
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name; tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
key_name_buf.append(tmp_buff, strlen(tmp_buff), cs); 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(','); key_name_buf.append(',');
f_idx= table_list->schema_table->idx_field2; 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 ...@@ -23630,8 +23633,9 @@ void JOIN_TAB::save_explain_data(Explain_table_access *eta, table_map prefix_tab
else else
eta->push_extra(ET_OPEN_FULL_TABLE); eta->push_extra(ET_OPEN_FULL_TABLE);
/* psergey-note: the following has a bug.*/ /* psergey-note: the following has a bug.*/
if (table_list->is_table_read_plan->has_db_lookup_value() && if (table_list->is_table_read_plan->trivial_show_command ||
table_list->is_table_read_plan->has_table_lookup_value()) (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); eta->push_extra(ET_SCANNED_0_DATABASES);
else if (table_list->is_table_read_plan->has_db_lookup_value() || else if (table_list->is_table_read_plan->has_db_lookup_value() ||
table_list->is_table_read_plan->has_table_lookup_value()) table_list->is_table_read_plan->has_table_lookup_value())
......
...@@ -8035,6 +8035,7 @@ static bool optimize_for_get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond ...@@ -8035,6 +8035,7 @@ static bool optimize_for_get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond
if (lsel && lsel->table_list.first) if (lsel && lsel->table_list.first)
{ {
/* These do not need to have a query plan */ /* These do not need to have a query plan */
plan->trivial_show_command= true;
goto end; goto end;
} }
......
...@@ -192,9 +192,17 @@ typedef struct st_lookup_field_values ...@@ -192,9 +192,17 @@ typedef struct st_lookup_field_values
class IS_table_read_plan : public Sql_alloc class IS_table_read_plan : public Sql_alloc
{ {
public: public:
IS_table_read_plan() : no_rows(false) {} IS_table_read_plan() : no_rows(false), trivial_show_command(FALSE) {}
bool no_rows; 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; LOOKUP_FIELD_VALUES lookup_field_vals;
Item *partial_cond; Item *partial_cond;
......
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