• unknown's avatar
    Bug#52168 decimal casting catastrophes: crashes and valgrind errors on simple casts · 229cc4e1
    unknown authored
    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.
    229cc4e1
item.cc 224 KB