diff --git a/sql/item.cc b/sql/item.cc index c93f3cfdeac..d3ea2335755 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6214,7 +6214,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference) set_field(from_field); } - else if (thd->column_usage != MARK_COLUMNS_NONE) + else if (should_mark_column(thd->column_usage)) { TABLE *table= field->table; MY_BITMAP *current_bitmap, *other_bitmap; @@ -9248,7 +9248,7 @@ bool Item_default_value::fix_fields(THD *thd, Item **items) if (!newptr) goto error; fix_session_vcol_expr_for_read(thd, def_field, def_field->default_value); - if (thd->column_usage != MARK_COLUMNS_NONE) + if (should_mark_column(thd->column_usage)) def_field->default_value->expr->walk(&Item::register_field_in_read_map, 1, 0); def_field->move_field(newptr+1, def_field->maybe_null() ? newptr : 0, 1); } @@ -9527,7 +9527,8 @@ void Item_trigger_field::setup_field(THD *thd, TABLE *table, method which is called during execution of these statements. */ enum_column_usage saved_column_usage= thd->column_usage; - thd->column_usage= MARK_COLUMNS_NONE; + thd->column_usage= want_privilege == SELECT_ACL ? COLUMNS_READ + : COLUMNS_WRITE; /* Try to find field by its name and if it will be found set field_idx properly. diff --git a/sql/sql_base.cc b/sql/sql_base.cc index c198bb2be33..8f6e1427dbc 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -5352,7 +5352,7 @@ Field *view_ref_found= (Field*) 0x2; static void update_field_dependencies(THD *thd, Field *field, TABLE *table) { DBUG_ENTER("update_field_dependencies"); - if (thd->column_usage != MARK_COLUMNS_NONE) + if (should_mark_column(thd->column_usage)) { MY_BITMAP *bitmap; @@ -5834,7 +5834,7 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list, fld= WRONG_GRANT; else #endif - if (thd->column_usage != MARK_COLUMNS_NONE) + if (should_mark_column(thd->column_usage)) { /* Get rw_set correct for this field so that the handler diff --git a/sql/sql_class.h b/sql/sql_class.h index 007cd426124..20bf2272db8 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -94,7 +94,8 @@ enum enum_slave_type_conversions { SLAVE_TYPE_CONVERSIONS_ALL_LOSSY, SLAVE_TYPE_CONVERSIONS_ALL_NON_LOSSY}; /* - MARK_COLUMNS_NONE: It is unknown whether the column will be read or written + MARK_COLUMNS_READ: A column is goind to be read. + MARK_COLUMNS_WRITE: A column is going to be written to. MARK_COLUMNS_READ: A column is goind to be read. A bit in read set is set to inform handler that the field is to be read. If field list contains duplicates, then @@ -105,7 +106,10 @@ enum enum_slave_type_conversions { SLAVE_TYPE_CONVERSIONS_ALL_LOSSY, to update this field in write_row and update_row. */ enum enum_column_usage -{ MARK_COLUMNS_NONE, MARK_COLUMNS_READ, MARK_COLUMNS_WRITE}; +{ COLUMNS_READ, COLUMNS_WRITE, MARK_COLUMNS_READ, MARK_COLUMNS_WRITE}; + +static inline bool should_mark_column(enum_column_usage column_usage) +{ return column_usage >= MARK_COLUMNS_READ; } enum enum_filetype { FILETYPE_CSV, FILETYPE_XML }; diff --git a/sql/sql_do.cc b/sql/sql_do.cc index f556dc282ed..20a7aa75590 100644 --- a/sql/sql_do.cc +++ b/sql/sql_do.cc @@ -29,7 +29,7 @@ bool mysql_do(THD *thd, List &values) List_iterator li(values); Item *value; DBUG_ENTER("mysql_do"); - if (setup_fields(thd, Ref_ptr_array(), values, MARK_COLUMNS_NONE, 0, NULL, 0)) + if (setup_fields(thd, Ref_ptr_array(), values, COLUMNS_READ, 0, NULL, 0)) DBUG_RETURN(TRUE); while ((value = li++)) (void) value->is_null(); diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 98f7f2bbed7..4cef25a9c29 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1315,7 +1315,7 @@ static bool check_view_insertability(THD * thd, TABLE_LIST *view) we must not set query_id for fields as they're not really used in this context */ - thd->column_usage= MARK_COLUMNS_NONE; + thd->column_usage= COLUMNS_WRITE; /* check simplicity and prepare unique test of view */ for (trans= trans_start; trans != trans_end; trans++) { diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 826095154e8..b7ab9185033 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1590,7 +1590,7 @@ bool fix_partition_func(THD *thd, TABLE *table, { DBUG_RETURN(FALSE); } - thd->column_usage= MARK_COLUMNS_NONE; + thd->column_usage= COLUMNS_WRITE; DBUG_PRINT("info", ("thd->column_usage: %d", thd->column_usage)); if (!is_create_table_ind || diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 97325050628..83775f66a81 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1318,7 +1318,7 @@ static bool mysql_test_insert(Prepared_statement *stmt, goto error; } if (setup_fields(thd, Ref_ptr_array(), - *values, MARK_COLUMNS_NONE, 0, NULL, 0)) + *values, COLUMNS_READ, 0, NULL, 0)) goto error; } } @@ -1424,7 +1424,7 @@ static int mysql_test_update(Prepared_statement *stmt, table_list->register_want_access(SELECT_ACL); #endif if (setup_fields(thd, Ref_ptr_array(), - stmt->lex->value_list, MARK_COLUMNS_NONE, 0, NULL, 0) || + stmt->lex->value_list, COLUMNS_READ, 0, NULL, 0) || check_unique_table(thd, table_list)) goto error; /* TODO: here we should send types of placeholders to the client. */ @@ -1597,7 +1597,7 @@ static bool mysql_test_do_fields(Prepared_statement *stmt, DT_PREPARE | DT_CREATE)) DBUG_RETURN(TRUE); DBUG_RETURN(setup_fields(thd, Ref_ptr_array(), - *values, MARK_COLUMNS_NONE, 0, NULL, 0)); + *values, COLUMNS_READ, 0, NULL, 0)); } diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 37a60d2dbb7..70a4572cd34 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -1935,7 +1935,7 @@ bool check_key_in_view(THD *thd, TABLE_LIST *view) marking as used fields which are not used */ enum_column_usage saved_column_usage= thd->column_usage; - thd->column_usage= MARK_COLUMNS_NONE; + thd->column_usage= COLUMNS_WRITE; DBUG_PRINT("info", ("thd->column_usage: %d", thd->column_usage)); for (Field_translator *fld= trans; fld < end_of_trans; fld++) { diff --git a/sql/table.cc b/sql/table.cc index 0c12715d379..1d3177fb017 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2859,7 +2859,7 @@ static bool fix_vcol_expr(THD *thd, Virtual_column_info *vcol) DBUG_ENTER("fix_vcol_expr"); const enum enum_column_usage saved_column_usage= thd->column_usage; - thd->column_usage= MARK_COLUMNS_NONE; + thd->column_usage= COLUMNS_WRITE; int error= vcol->expr->fix_fields(thd, &vcol->expr);