summaryrefslogtreecommitdiff
path: root/sql/sql_select.h
diff options
context:
space:
mode:
authorGeorgi Kodinov <joro@sun.com>2010-01-15 16:09:20 +0200
committerGeorgi Kodinov <joro@sun.com>2010-01-15 16:09:20 +0200
commit7a7147c5b4cca1bfd1bfbecd4883d3968526b162 (patch)
tree54f21643537d7cb5e55cbd0f10488a1ac33c12f1 /sql/sql_select.h
parent0305aea88a220ff9080432a65d50cb30493f3109 (diff)
downloadmariadb-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/sql_select.h')
-rw-r--r--sql/sql_select.h12
1 files changed, 12 insertions, 0 deletions
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);