Bug #46175: NULL read_view and consistent read assertion
The optimizer must not continue executing the current query if e.g. the storage engine reports an error. This is somewhat hard to implement with Item::val_xxx() because they do not have means to return error code. This is why we need to check the thread's error state after a call to one of the Item::val_xxx() methods. Fixed store_key_item::copy_inner() to return an error state if an error happened during the call to Item::save_in_field() because it calls Item::val_xxx(). Also added similar checks to related places.
This commit is contained in:
parent
6d66e66030
commit
440f5a9cad
@ -5141,7 +5141,7 @@ int Item::save_in_field(Field *field, bool no_conversions)
|
|||||||
field->set_notnull();
|
field->set_notnull();
|
||||||
error=field->store(nr, unsigned_flag);
|
error=field->store(nr, unsigned_flag);
|
||||||
}
|
}
|
||||||
return error;
|
return error ? error : (field->table->in_use->is_error() ? 2 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -709,6 +709,12 @@ public:
|
|||||||
my_bitmap_map *old_map= dbug_tmp_use_all_columns(table,
|
my_bitmap_map *old_map= dbug_tmp_use_all_columns(table,
|
||||||
table->write_set);
|
table->write_set);
|
||||||
int res= item->save_in_field(to_field, 1);
|
int res= item->save_in_field(to_field, 1);
|
||||||
|
/*
|
||||||
|
Item::save_in_field() may call Item::val_xxx(). And if this is a subquery
|
||||||
|
we need to check for errors executing it and react accordingly
|
||||||
|
*/
|
||||||
|
if (!res && table->in_use->is_error())
|
||||||
|
res= 2;
|
||||||
dbug_tmp_restore_column_map(table->write_set, old_map);
|
dbug_tmp_restore_column_map(table->write_set, old_map);
|
||||||
null_key= to_field->is_null() || item->null_value;
|
null_key= to_field->is_null() || item->null_value;
|
||||||
return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res);
|
return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res);
|
||||||
@ -742,6 +748,12 @@ protected:
|
|||||||
if (!err)
|
if (!err)
|
||||||
err= res;
|
err= res;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Item::save_in_field() may call Item::val_xxx(). And if this is a subquery
|
||||||
|
we need to check for errors executing it and react accordingly
|
||||||
|
*/
|
||||||
|
if (!err && to_field->table->in_use->is_error())
|
||||||
|
err= 2;
|
||||||
}
|
}
|
||||||
null_key= to_field->is_null() || item->null_value;
|
null_key= to_field->is_null() || item->null_value;
|
||||||
return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err);
|
return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user