diff options
author | Georgi Kodinov <joro@sun.com> | 2010-01-15 16:09:20 +0200 |
---|---|---|
committer | Georgi Kodinov <joro@sun.com> | 2010-01-15 16:09:20 +0200 |
commit | 7a7147c5b4cca1bfd1bfbecd4883d3968526b162 (patch) | |
tree | 54f21643537d7cb5e55cbd0f10488a1ac33c12f1 /sql | |
parent | 0305aea88a220ff9080432a65d50cb30493f3109 (diff) | |
download | mariadb-git-7a7147c5b4cca1bfd1bfbecd4883d3968526b162.tar.gz |
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.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.cc | 2 | ||||
-rw-r--r-- | sql/sql_select.h | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/sql/item.cc b/sql/item.cc index b35a6ae3d6e..68c10c32b50 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -5141,7 +5141,7 @@ int Item::save_in_field(Field *field, bool no_conversions) field->set_notnull(); error=field->store(nr, unsigned_flag); } - return error; + return error ? error : (field->table->in_use->is_error() ? 2 : 0); } diff --git a/sql/sql_select.h b/sql/sql_select.h index c9cd3ecba42..dd99d358bac 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -709,6 +709,12 @@ public: my_bitmap_map *old_map= dbug_tmp_use_all_columns(table, table->write_set); 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); null_key= to_field->is_null() || item->null_value; return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res); @@ -742,6 +748,12 @@ protected: if (!err) 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; return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err); |