diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-01-03 14:55:29 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-02-13 18:12:04 +0100 |
commit | cf003933785cbf88504bcf81001c776dabd64b15 (patch) | |
tree | 10a23e84cf9c4f62dc2b8455f639bc0a18bc5da2 /sql/item.cc | |
parent | cd4dd2b62dda31a4ea1da99ca6732ecb7ee0d628 (diff) | |
download | mariadb-git-cf003933785cbf88504bcf81001c776dabd64b15.tar.gz |
Race condition in DEFAULT() with expressions
Item_default_value::calculate was updating table->s->default_values,
but it is supposed to be read-only
Diffstat (limited to 'sql/item.cc')
-rw-r--r-- | sql/item.cc | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/sql/item.cc b/sql/item.cc index a2c59255b55..3b3e878f4d3 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -8758,17 +8758,22 @@ bool Item_default_value::fix_fields(THD *thd, Item **items) goto error; memcpy((void *)def_field, (void *)field_arg->field, field_arg->field->size_of()); - def_field->move_field_offset((my_ptrdiff_t) - (def_field->table->s->default_values - - def_field->table->record[0])); - set_field(def_field); - if (field->default_value) + IF_DBUG(def_field->is_stat_field=1,); // a hack to fool ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED + if (def_field->default_value && def_field->default_value->flags) { - fix_session_vcol_expr_for_read(thd, field, field->default_value); + uchar *newptr= (uchar*) thd->alloc(1+def_field->pack_length()); + if (!newptr) + goto error; + fix_session_vcol_expr_for_read(thd, def_field, def_field->default_value); if (thd->mark_used_columns != MARK_COLUMNS_NONE) - field->default_value->expr->walk(&Item::register_field_in_read_map, 1, 0); - IF_DBUG(def_field->is_stat_field=1,); // a hack to fool ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED + 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); } + else + def_field->move_field_offset((my_ptrdiff_t) + (def_field->table->s->default_values - + def_field->table->record[0])); + set_field(def_field); return FALSE; error: @@ -8793,6 +8798,7 @@ void Item_default_value::calculate() { if (field->default_value) field->set_default(); + DEBUG_SYNC(field->table->in_use, "after_Item_default_value_calculate"); } String *Item_default_value::val_str(String *str) |