summaryrefslogtreecommitdiff
path: root/sql/item.h
diff options
context:
space:
mode:
authorunknown <oystein.grovlen@sun.com>2010-05-28 17:30:39 +0200
committerunknown <oystein.grovlen@sun.com>2010-05-28 17:30:39 +0200
commit229cc4e191346ecd93ae7154c9e9b4f8f693b56c (patch)
tree33c6a6b8ab8950c484744de565554274b321c321 /sql/item.h
parentba36de4f2e429abfbaf968939e6ce57045488ef9 (diff)
downloadmariadb-git-229cc4e191346ecd93ae7154c9e9b4f8f693b56c.tar.gz
Bug#52168 decimal casting catastrophes: crashes and valgrind errors on simple casts
The problem is that if a NULL is stored in an Item_cache_decimal object, the associated my_decimal object is not initialized. However, it is still accessed when val_int() is called. The fix is to check for null_value within val_int(), and return without accessing the my_decimal object when the cached value is NULL. Bug#52122 reports the same issue for val_real(), and this patch also includes fixes for val_real() and val_str() and corresponding test cases from that bug report. Also, NULL is returned from val_decimal() when value is null. This will avoid that callers access an uninitialized my_decimal object. Made similar changes to all other Item_cache classes. Now all val_* methods should return a well defined value when actual value is NULL. mysql-test/r/type_decimal.result: Updated result file with test cases for Bug#52168 and Bug#52122. mysql-test/t/type_decimal.test: Added test cases for Bug#52168 and Bug#52122. sql/item.cc: In Item_cache_*::val_* methods, return a well defined value when actual value is NULL. This is especially important for Item_cache_decimal since otherwise one risk accessing an uninitialized my_decimal object. sql/item.h: Added method Item_cache::has_value() which returns TRUE if cache object contains a non-null value.
Diffstat (limited to 'sql/item.h')
-rw-r--r--sql/item.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/sql/item.h b/sql/item.h
index 5f4f96f97d3..8360fa61498 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -3191,6 +3191,15 @@ public:
{
return this == item;
}
+ /**
+ Check if saved item has a non-NULL value.
+ Will cache value of saved item if not already done.
+ @return TRUE if cached value is non-NULL.
+ */
+ bool has_value()
+ {
+ return (value_cached || cache_value()) && !null_value;
+ }
virtual void store(Item *item);
virtual bool cache_value()= 0;
bool basic_const_item() const